asp.net core Program.cs and StartUp.cs

ㆍProgram.cs

public class Program
{
       public static void Main(string[] args)
       {
              CreateHostBuilder(args).Build().Run();
       }

       public static IHostBuilder CreateHostBuilder(string[] args) =>
              Host.CreateDefaultBuilder(args)
                   .ConfigureWebHostDefaults(webBuilder =>
                    {
                          webBuilder.UseStartup<Startup>();
                    });
}

ㆍStartup.cs

public class Startup
{
       public Startup(IConfiguration configuration)
       {
              Configuration = configuration;
       }

       public IConfiguration Configuration { get; }

       public void ConfigureServices(IServiceCollection services)
       {
             services.AddControllersWithViews();
       }
       
       public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
       {
             if (env.IsDevelopment())
             {
                    app.UseDeveloperExceptionPage();
             }
             else
             {
                   app.UseExceptionHandler(“/Home/Error”);
                   app.UseHsts();
             }

             app.UseHttpsRedirection();
             app.UseStaticFiles();

             app.UseRouting();
             app.UseAuthorization();
             app.UseEndpoints(endpoints =>
             {
                   endpoints.MapControllerRoute(
                   name: “default”,
                   pattern: “{controller=Home}/{action=Index}/{id?}”);
             });
       }
}


public Startup(IConfiguration configuration)
   startup클래스의 생성자로 configuration 객체를 주입(ID) 받아 startup.cs 내에서 appSetting.json 에서 설정한 정보를
   사용할수있게 만들어준다.( 생성자에서 주입된 configuration객체는, 전역으로 선언된 Configuration  프로퍼티로 할당됨)

public void ConfigureServices(IServicesCollection services)
   현재 웹프로젝트의 어떤한 웹 페이지가 실행되면서 로드되어야할 각종 서비스들을 추가하게되는 서비스 컨테이너이다.

   의존성주입 또는 쿠키 , 세션사용등 추가적인 서비스들,   Configure()  메서드에서 사용될 미들웨어들에 들의 서비스들을
   환경설정과 함께 추가 구성할수있다.

 ㆍpublic void Configure(IApplicationBuilder app , IEnvironment env)
    사용자 요청한 웹페이지가 실행되기전, 먼저 실행되어야할 미들웨어들이 실행되는 전처리 구간이다.

    ConfigureServices에 추가된 서비스들을 실제 미들웨어에 추가하거나 app.Use( ), app.Run(), app,Map() 들을 통해,
    선처리가 가능하며 app.Middleware<T>  를 이용한 사용자 미들웨어 추가등을 할 수 있다.
     ConfigureServices에서 필요한 서비스를 추가하는 메서드라면 configureConfigureServices 에서 추가한 서비스들을
     파이프라인에 추가하여 작동하는 구간이라고 볼 수 있다.

ㆍpublic void Configure(IApplicationBuilder app , IEnvironment env)  에서 사용되는 미들웨어들
app.UseHttpsRedirection();

http:// 로 들어온 요청을 , https:// 로 리다이렉트 전달하는 미들웨어이다.  단, 웹서버의 SSL이설정되어 , 호스트가 작동 되고 있어야 하며,   SSL 설정이 없으며 , 그냥 http로 열린다.

예를들어, http://localhost:6478/  을 요청하면, https://localhost:44322/ 로 자동으로 리다이렉트 하는 것을 볼수있으며,
만약 https://localhost:44322/가 작동하지 않는다면, 아무 반응 없이 기본, http://localhost:6478/ 로 열리게된다.

 

 http 와 https 로 작동되게 프로젝트를 만들고(프로젝트생성시, SSL체크하던가 , 프로젝트 속성에서 SSL체크)

  – SSL 포트를 강제로 지정
   ConfigureServices() 컨테이너에서 서비스 옵션을 추가하고  미들웨어에서 실행한다.

       pubilc void ConfigureServices(IServicesCollection services)
       {
             services.AddHttpsRedirection(options =>
             {
                   //options.RedirectStatusCode = (int)HttpStatusCode.TemporaryRedirect;
                   options.HttpsPort = 5001;
             });
       }

       public void Configure(IApplicationBuilder app , IEnvironment env)
       {  
             app.useHttpsRedirect(); 
       }

  http://localhost:6478/  을 요청하면, https://localhost:44322/ 가 작동하고 있지만 https://localhost:5001 로 이동한다.
  (https 가 운영되고 있지않아도 강제로 이동한다.)

ㆍapp.UseStaticFiles();

웹 페이지 내에서 사용되는 정적파일(이미지 , css , js , hwp , pdf 등의 정적파일)을,  지정한 경로에서  서빙하도록 추가하는 미들웨어, 정적경로를 따로 지정하지 않으면 기본적으로 웹 프로젝트의 “wwwroot” 경로가 지정되어 있으며,  “wwwroot” 폴더에 “image”폴더를 만들고 이미지파일을 업로드하면,  “http://locahost/image/업로드이미지.jpg” 호출시 파일이 서빙됨

wwwroot\upload.jpghttp://localhost:6478/upload.jpg
wwwroot\image\upload.jpghttp://localhost:6478/image/upload.jpg

만약 미들웨어에, app.UseStaticFiles() 미들웨어를 호출하지 안터라도 기본적으로 “wwwroot” 폴더에서 정적파일을 서빙해온다.

기본 정적 파일 미들웨어(app.UseStaticFiles();가 UseAuthentication전에 호출되어야 wwwroot 아래의 정적 자산은 공개적으로 액세스할 수 있습니다.


–   정적서빙파일 폴더 지정하기

★★app.UseStaticFiles() 정적파일 미들웨어옵션은  ConfigureServices() 컨테이너를 통해 서비스 등록시 옵션을 추가하지않고 UseStaticFiles() 확장메서드를 사용해 ,미들웨어 추가시 직접 옵션을 설정한다.

정적 파일경로/wwwroot/
이미지물리경로/wwwroot/image/test.png
URL(기본:wwwroot)http://localhost/6479/image/test.png


       app
.UseStaticFiles(new StaticFileOptions()

       {
              RequestPath = new PathString(“/MyImageFolder”); // 반드시 상대경로 “/”로 시작하여 추가해야됨
       });

호출 http://localhost:6478/MyImageFolder/image/test.png

ㆍ정적파일 물리적 경로 추가

  app.UseStaticFiles(new StaticFileOptions()
  {
        FileProvider = new PhysicalFileProvider(“/UserImg”) // 이렇게 지정하면 c:\UserImg경로됨, 유의
  });

기본경로(물리적)C:\Users\Pluginn\source\repos\TestProject\TestProject\wwwroot
추가경로(물리적)C:\userImage
 wwwroot 도 사용되고 userImg 둘다 사용가능하게됨

  app.UseStaticFiles(new StaticFileOptions()
  {
        FileProvider = new PhysicalFileProviderPath.Combine(Directory.GetCurrentDirectory() , “UserImg”)) 
  });

기본경로(물리적)C:\Users\Pluginn\source\repos\TestProject\TestProject\wwwroot
추가경로(물리적)C:\Users\Pluginn\source\repos\TestProject\TestProject\UserImg
호출http://localhost:6478/image/test.png  — wwwroot 의 image 찾아감
http://localhost:6478/test.png –/UserImg 로  image  찾아감

  ㆍ정적파일 물리적 경로 여러개 추가하기 – UseStaticfiels 확장메서드 미들웨어 여러분 추가함

 
app
.UseStaticFiles(new StaticFileOptions()

  {
        FileProvider = new PhysicalFileProviderPath.Combine(Directory.GetCurrentDirectory() , “UserImg”)) ,
        RequestPath = new PathString(“/UserImgAll“)
  });

  app.UseStaticFiles(new StaticFileOptions()
  {
        FileProvider = new PhysicalFileProviderPath.Combine(Directory.GetCurrentDirectory() , “MyImg”)) 
  });

FileProvider 를 통해 지정된 폴더는 정적파일루트경로이므로   http://localhost:6578/uploadFile.jpg 로 호출해야하며, 파일구분을 위해서는 반드시 서브폴더를 생성하여야한다.
기본경로(물리적)C:\Users\Pluginn\source\repos\TestProject\TestProject\wwwroot
추가경로(물리적)C:\Users\Pluginn\source\repos\TestProject\TestProject\UserImg
 http://localhost:6578/UserImgAll/upload.jpg 
— RequestPath  에서 저장한 가상경로, 호출시 경로명으로 입력해줘야한다.
추가경로(물리적)C:\Users\Pluginn\source\repos\TestProject\TestProject\MyImg
userImgMyImg 를 정적파일 경로로 더 추가함 기본적으로 wwwroot 도 지원하므로 총 3군데 경로가 생김
http://localhost:6578/upload.jpg 호출시 : wwroot 의 upload.jpg 가 먼저 출력되며, 만약없으면 userImg , MyImg 경로 순으로 찾아가 서빙힌다.

ㆍ정적파일 캐시 시간지정 하기
   var cacheMaxAge =(30).ToString();
   app.UseStaticFiles(new StaticFileOptions
   {
          OnPrepareResponse = ctx =>
          {
                 ctx.Context.Response.Headers.Append(“Cache-Control”, $”public, max-age={cacheMaxAge }”);
           }
   });

한번 읽어들인 정적파일에 대해 30초간 캐쉬된 파일을 읽어온다(서버에서 새로 안 읽어옴)
캐쉬 설정을 안하더라도 정적파일에 대해 기본 캐쉬시간이 있기때문에, 매번 서버로 부터 서빙 받기위해서는
캐쉬 시간 설정을 0 으로 하여, 서버로 부터 계속 읽어오도록하자
ㆍapp.UseRouting();

 app.UseRouting()은,  전달받은 URI 의 경로를 파악하여, 요청한 URL 과 매핑되는 controller(action) 로 라우팅해준다.
 이때,  app.UseEndPoints() 미들웨어에 설정된 endPoints.MapControllerRoute()메서드를 통해  매핑도니 Route 경로로  이동한다.d
 app.UseEndpoints() 미들웨어가 작동하기 위해서는 서비스 콘테이너에 services.AddMvc() 와 같은 app.useEndpoints() 미들웨어를 지원하는 서비스를 등록해야한다. 

services.AddMvc() → app.UseEndpoints(endpoints) → app.UseRouting() → endpoints.MapControllerRoute()

– ConfigureServices(IServiceCollection services) 메서드에 서비스 등록
   services.AddMvc();

– Configure(IApplication app)
   app.useRouting();

   app.UseEndPoints(endpoints =>
   {
        endpoints.MapControllerRoute(
        name: “default”,
        pattern: “{controller=Home}/{action=Index}/{id?}”);
   });

ㆍ지원하는 서비스
  AddMvc() , AddControllersWithViews() , AddController() , AddRazorPages()

app.UseCors();

[Cors 정책 설정하기]

1) Services.AddCors() 를 통합 허용 도메인 및 허용동사 설정
2) app.UseCors(); 
3) userContorller.cs 에서 [EnableCors(‘Cors이름’)] , [DisabledCors] attribute 활용  , 엔드포인트 라우팅 사용   

ㆍUseCors 및 UseStaticFiles 순서
일반적으로 UseStaticFiles는 UseCors 이전에 호출됩니다. JavaScript를 사용하여 사이트 간 정적 파일을 검색하는 앱은 UseStaticFiles 이전에 UseCors를 호출해야 합니다.

— configureServices() 메서드에서 서비스 옵션 설정
1) Services.AddCors(options =>
{
       options.AddPolicy(name: “MyCorsPolicy“, policy => {
       policy.WithOrigins(
                                      “http://example.com”, “http://www.contos.com”, “https://cors1.azurewebnet”, “https://localhost:80”
                                     )
       .WithMethods(“PUT”, “DELETE”, “GET”);
       });
});

— configure() 메서드 미들웨어 등록
2) app.UseCors();

— controller 클래스 사용

3) Attribute 로 Cors 정책 사용하기

[EnableCors(“MyCorsPolicy“)]

public class MyClass
{
           public MyClass()
           {
           }
           
           [HttpGet]
           public void Get()
           {

           }

          // GET: api/MyClass/5      
          [HttpGet(“{id}”)]
          public void Get(int id)   {     }
   
         //Get : api/MyClass/myaction    

         [DisableCors]    // cors 정책적용 안함
         [HttpGet(“action”)]
         public void GetAction(string action)    {     }
 
}

★ EndPoint Routing 을 이용한 Cors 활성화 “RequreCors” 메서드 사용하기
1) Services.AddCors() 를 통합 허용 도메인 및 허용동사 설정
2) app.UseCors(); 
3) endPoint 라우트 에 확장메서드 RequireCors(“Cors정책이름”) 로 설정하기
3) userContorller.cs 에서 [EnableCors(‘Cors이름’)] , [DisabledCors] attribute 활용 

— configureServices() 메서드 등록
1) Services.AddCors(options =>
{
       options.AddPolicy(name: “MyCorsPolicy“, policy => {
       policy.WithOrigins(
                                      “http://example.com”, “http://www.contos.com”, “https://cors1.azurewebnet”, “https://localhost:80”
                                     )
       .WithMethods(“PUT”, “DELETE”, “GET”);
       });
});

— configure() 메서드 미들웨어 등록
2) app.UseCors();
    또는,  app.UseCors(option => {}); 을 통해 services.AddCors() 등록하지 않고도 사용가능

3) app.UseEndpoints(endpoints =>
    {
            endpoints.MapControllerRoute(
             name: “default”,
            pattern: “{controller=Home}/{action=Index}/{id?}”).RequireCors(“MyCorsPolicy“);
    });

 
 
app.UseResponseCompression();
app.UseResponseCaching();

[응답캐시 설정하기]
* configureServices() 메서드에서 서비스 옵션 추가
Services.AddResponseCaching(options =>
{
       options.MaximumBodySize = 1024;  
       options.UseCaseSensitivePaths = true;
});

* configure() 메서드에 미들웨어추가
app.UseResponseCaching();

MaximumBodySize응답 본문의 캐시 가능한 최대 크기(바이트)입니다.기본값은 64 * 1024 * 1024(64MB)
UseCaseSensitivePaths 대/소문자를 구분하는 경로에서 응답이 캐시되는지 여부를 결정합니다. 기본값은 false
SizeLimit
응답 캐시 미들웨어의 크기 제한(바이트)입니다. 기본값은 100 * 1024 * 1024(100MB)
 

       

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다