저는 EntityFramework 사용하는 걸 별로 안좋아라 하는데요.


이 기능은 괜찮은 듯합니다. ^^;


FromSql 과 ExecuteSqlCommandAsync 입니다.


이 구문을 사용하면 Stored Procedure 를 사용할 수 있는데요.


이 구문을 사용하다가 Error 가 발생했습니다.



아래를 보시면 분명히 Stored Procedure 의 Parameter 가 선언이 되어 있는데요.

선언이 안되어 있다면서... 오류를 뱉내요...

철자가 틀린 것도 아닌데요. ㅡㅡ;



그래서 또 우리의 친구 Google 을 찾아 갔습니다.


그 결과 두둥!!!


EF Core 는 Parameter 이름을 지정하는 기능을 지원하지 않는다고 하네요. 그래서 Parameter 를 순서대로 @p0, @p1, ... 이런식으로 나열을 해야한다고 합니다. 헐렝...




그래서 고쳐서 Test 해 본 결과 

되네요... 



100% 맘에 드는 건 아니네요. ㅡㅡ;


그리고 INSERT, UPDATE, DELETE 를 할 때 ExecuteSqlCommandAsync 를 사용할 수 있는데요.

이 녀석은 적용받은 Row 의 수, int 값 만을 반환합니다. 알아두셔요. 



행복한 고수되셔요.



woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




Posted by woojja

Shared Project in VisualStudio


Microsoft 사의 Open 된 Source 를 보던 중 희안한 아이콘의 Project 를 보게 되었습니다.



헙!!! 이게 뭐징? 

하는 궁금증은 바쁜 일에 그냥 넘어갔습니다.


어디에 쓰는 프로젝트 이름으로 짐작하기만 했죠.



어느날 갑자기 그 프로젝트를 써봐야할 듯 해서 찾아 봤습니다.

먼저 Solution 파일을 Editor 로 열어봤습니다.




아니면 그냥 해당 폴더로 가서 프로젝트를 찾아 보시면  shproj 확장자를 가지고 있다는 걸 알수 있습니다.



그리고는 Project 가 있는지 찾아봤습니다.


Solution Explorer 에서 Solution 을 오른쪽 클릭하여 Add.../ New Project 을 클릭하면 Add New Project ... 창이 나타납니다.


하지만 아무리 찾아봐도 비스므레한 프로젝트는 없었습니다.


흠... 우리의 친구 구글... 구글링에 들어갑니다.


그 결과 Shared Project Reference Manager 라는 VisualStudio Extention 이 있다는 걸 발견했습니다.


https://marketplace.visualstudio.com/items?itemName=KieranMockfordMSFT.SharedProjectReferenceManager


화면에 Download 보이시죠?



클릭하여 다운받아 설치합니다.



오호~~ 프로젝트 템플릿이 생겼습니다...

추가해 봅시다.



오호호~~ 여러 프로젝트에서 사용할 수 있는 Class 를 생성하여 공통으로 사용할 수 있는 녀석으로 굳이 Entity 나 Utility 성의 Class 를 굳이 dll 로 떼어서 관리하지 않아도 되겠네요. ^^


음... 그런데 생각해 보면 여러 Project 가 이 Shared Project 를 참조하게 되면 생성되는 각각의 Assembly 들의 크기가 증가하겠네요... dll 을 참조하면 될텐데도 말이죠...


같은 기능을 하지만 여러 플랫폼을 대상으로 하는 dll 을 생성할 때와 같은 상황에서 이용하면 되겠군요.

jumptovb_Utilityx32.dll, jumptovb_Utilityx64.dll 와 같이 말이죠...





행복한 고수되셔요.



woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\








'Tools' 카테고리의 다른 글

[Tools] Shared Project in VisualStudio  (0) 2018.10.18
[Tools] GUID Maker Updated.  (0) 2017.10.31
[Tools] Log4Net  (0) 2017.10.12
[Tools] DotNetZip  (0) 2017.10.10
[Tools] 3 Ways to Change Bitrate on MP3 Files  (0) 2017.09.08
[Tools] NShape  (0) 2017.06.28
Posted by woojja


REST API 의 예제를 보면 여러 Parameter 를 사용하는 Method 를 볼 수있습니다.

간단히? 되리라 생각하지만 턱 하니 막히기도 하지요.


예제를 보면 아래와 같이 Method 에 사용하는 Multiple Parameter 지만 에 일반 Parameter 와 [FromBody] Attribute 를 달고 있는 Parameter 를 한꺼번에 사용하는 녀석을 만날 수 있습니다. 


// PUT api/values/5
        public void Put(int id, [FromBody]string value)
        {
        }

 ASP.NET Core 로 개발 중 위와 같은 Method 를 Postman 에서 테스트하는 중 Value 에 값이 Null 로 들어오는 것을 발견했습니다. 




Postman 에서 Test 시 요로케 입력하면 되는군요... ㅋㅋㅋ



구글링하다 알게 되었네요...




행복한 고수되셔요...


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\






Posted by woojja


RestAPI 호출시 발생한 ajax Error 0




문제는 CORS 설정때문이었다.


Cors 에 대한 내용을 추가해주자...



Startup.cs


    public class Startup

    {

        public IConfiguration Configuration { get; set; }


        public Startup(IConfiguration configuration)

        {

            Configuration = configuration;

        }


        // This method gets called by the runtime. Use this method to add services to the container.

        // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940

        public void ConfigureServices(IServiceCollection services)

        {

            // services.AddMvc(); 보다 앞에 위치 시킨다. (이건 Test 해보지 않았다. ^^;)

            services.AddCors();


            services.AddMvc();


            services.AddDataAccess();

            services.AddBusinessLogics();


            var configBuilder = new ConfigurationBuilder()

               .SetBasePath(Directory.GetCurrentDirectory())

               .AddJsonFile("appsettings.json", optional: true);

            var config = configBuilder.Build();


            services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

        }


        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.

        public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)

        {

            if (env.IsDevelopment())

            {

                app.UseDeveloperExceptionPage();

            }


            // app.UseMvc(); 보다 앞에 위치 시킨다.

            app.UseOptions();


            //app.UseCors(builder => 

            //    builder.AllowAnyOrigin()

            //    .AllowCredentials()

            //    .AllowAnyHeader()

            //    .AllowAnyMethod()

            //    //.WithMethods("POST,GET,PUT,PATCH,DELETE,OPTIONS")

            //);


            //app.UseCors(builder =>


            //    //builder.AllowAnyOrigin().AllowAnyMethod()

            //    //.WithHeaders(HeaderNames.ContentType, "Authorization", "X-Requested-With")

            

//    builder.WithOrigins("*")

            //    //.AllowAnyOrigin()

            //    .AllowCredentials()

            //    .WithMethods("POST,GET,PUT,PATCH,DELETE,OPTIONS")

            //    .AllowAnyHeader()

            //    //.WithHeaders("Authorization", "X-Requested-With")

            //    );


            app.UseMvc();


            app.UseMvcWithDefaultRoute();


        }

    }



OptionsMiddleware.cs

    public static class OptionsMiddlewareExtensions

    {

        public static IApplicationBuilder UseOptions(this IApplicationBuilder builder)

        {

            return builder.UseMiddleware<OptionsMiddleware>();

        }

    }


    public class OptionsMiddleware

    {

        private readonly RequestDelegate _next;

        private IHostingEnvironment _environment;


        public OptionsMiddleware(RequestDelegate next, IHostingEnvironment environment)

        {

            _next = next;

            _environment = environment;

        }


        public async Task Invoke(HttpContext context)

        {

            this.BeginInvoke(context);

            await this._next.Invoke(context);

        }


        private async void BeginInvoke(HttpContext context)

        {

            //context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

            ////context.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*", (string)context.Request.Headers["Origin"] });

            ////context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "Origin, X-Requested-With, Content-Type, Content-Type: application/json, Accept, Accept: application/json, Authorization" });

            //context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "*" });

            //context.Response.Headers.Add("Access-Control-Allow-Methods", new[] { "GET, POST, PUT, DELETE, OPTIONS" });

            //context.Response.Headers.Add("Access-Control-Allow-Credentials", new[] { "true" });


            context.Response.Headers.Add("Access-Control-Allow-Origin", "*");

            context.Response.Headers.Add("Access-Control-Allow-Credentials", "true");

            // Added "Accept-Encoding" to this list

            //context.Response.Headers.Add("Access-Control-Allow-Headers", new[] { "*" });

            context.Response.Headers.Add("Access-Control-Allow-Headers", "Authorization, Content-Type, X-Requested-With, Accept, Accept-Version, Accept-Encoding, Content-Encoding, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name");

            context.Response.Headers.Add("Access-Control-Allow-Methods", "POST,GET,PUT,PATCH,DELETE,OPTIONS");


            if (context.Request.Method == "OPTIONS")

            {

                //context.Response.StatusCode = 200;

                //await context.Response.WriteAsync("OK");


                context.Response.StatusCode = (int)HttpStatusCode.OK;

                await context.Response.WriteAsync(string.Empty);

            }


        }

    }



Startup.cs 에서 


            .AllowAnyMethod() 대신 


            .WithMethods("POST,GET,PUT,PATCH,DELETE,OPTIONS") 로 변경해 보았는데.



Origin 과는 전혀 상관없는 오류가 발생했다. ㅡㅡ;

그렇다면 모든 Methos 를 열어줘야 한다는 이야기가 되는데... 그럼 안되겠죠? ㅋㅋ


그래서 app.UseCors(....) 를 사용하지 않고 위에 적어 놓은 Middleware 를 사용하기로 결정했다. 

Origins 의 경우는  Test 를 거쳐 변경할 예정이다.

Headers 의 경우도 현재는 Authorization, Content-Type, X-Requested-With 만 필요하지만 일단 다른 Header 들도 추가해 놓은 상태다.



ASP.NET Core 의 경우 ASP.NET 보다 유연하겠구나 라는 생각이 들긴하지만 서비스 내용을 바탕으로 설정해줘야 할 것들을 숙지하고 해둬야 하겠다.


이젠 WebSocket 을 붙여야 하는 상황인데...

Test 를 해보니 Socket 으로 가야할 녀석이 Controller 로 Routing 되는 걸 알게 되었다.


그럼 이만 Socket Test 하러... 슝~!




행복한 고수되셔요.


woojja ))*

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\




Posted by woojja
이전버튼 1 이전버튼