OWIN Startup.cs 클래스를 사용하고 있고 모든 구성을 그곳으로 옮기려면 Global.asax.cs 파일이 필요합니까?


197

예를 들어 개별 계정 템플릿을 사용하여 MVC로 만든 새로운 ASP.NET MVC 5 응용 프로그램에서 Global.asax.cs클래스를 삭제하고 Startup.cs Configuration()다음과 같이 구성 코드를 메소드로 이동 하면 단점은 무엇입니까?

public partial class Startup
{
     public void Configuration(IAppBuilder app)
     {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        ConfigureAuth(app);
    }
}

나에게 단점은 ASP.NET 4 응용 프로그램을 ASP.NET 5로 업그레이드하고 Startup.cs 클래스에서 구성 해야하는 부분을 사용할 때 관련성있는 두 가지 클래스에서 종속성 주입 및 기타 구성을 수행하지 않는다는 것입니다 시작 및 구성.


AreaRegistration.RegisterAllAreas();이 방법을 시작할 때와 같이 사용할 수 없으므로 오류가 발생했습니다 Application_Start. 그러나 내 응용 프로그램은 API
Harvey

답변:


171

Startup.Configuration이 Application_Start보다 약간 늦게 호출되지만 대부분의 경우 그 차이가별로 중요하지 않다고 생각합니다.

Global.asax에서 다른 코드를 유지 한 주요 이유는 다음과 같습니다.

  1. 이전 버전의 MVC와 일치합니다. (현재 모든 사람들이이 코드를 찾을 것으로 기대합니다.)
  2. 다른 이벤트 핸들러를 추가하는 기능 Global.asax에서는 Session_Start 및 Application_Error와 같은 다른 방법을 처리 할 수 ​​있습니다.
  3. 다양한 인증 시나리오의 정확성 bin 디렉토리에 Microsoft.Owin.Host.SystemWeb.dll이있는 경우에만 Startup.Configuration 메소드가 호출됩니다. 이 DLL을 제거하면 Startup.Configuration 호출을 자동으로 중지하므로 이해하기 어려울 수 있습니다.

일부 시나리오에는이 DLL이 포함되어 있지 않기 때문에 세 번째 이유는 기본적 으로이 방법을 사용하지 않은 가장 중요한 이유라고 생각합니다. 비 관련 코드가있는 위치를 무효화하지 않고 인증 방법을 변경할 수있는 것이 좋습니다 경로 등록)이 배치됩니다.

그러나 이러한 이유 중 어느 것도 시나리오에 적용되지 않으면이 방법을 사용하는 것이 좋습니다.


19
Startup.Configuration ()을 사용하는 또 다른 이점은 단 한 줄의 코드로 owin 자체 호스트를 사용하여 웹 사이트를 쉽게 호스팅 할 수 있다는 것입니다. WebApp.Start <Startup> ( " localhost : 3001 /" ) asp.net/web-api/ 개요 / 호스팅 - ASPNET - 웹 API는 / ... 그것은 통합 테스트를 작성하는 경우에 편리합니다
보리스식이 립 시즈에게

16
"자동으로 Startup.Configuration 호출 중지"부작용을 방지하기 위해 이름 규칙에 의존하지 않고 OWIN 시작에 사용할 유형을 명시 적으로 지정하는 web.config appSettings 키 "owin : appStartup"을 추가 할 수 있습니다. 조회. 이것은 또한 다른 환경 (dev / test / prod)을위한 다른 구성을 지원하는데 편리합니다
Thiago Silva

2
# 3의 경우 +1 빈 템플릿 ASP.NET 웹 사이트를 만들고 WebApi.Owinnuget 패키지를 추가하기 위해 Web API를 시작하기를 원했습니다 . IIS에서 실행할 모든 것을 포함하도록 종속성을 잘못 예상했습니다. 왜 Owin 스타트 업이 IIS 종속성을 분리하기를 원했기 때문에 그렇게 생각했는지 모르겠습니다.
Pluc

@dmatson 마지막 문장에서 기본적으로 Startup 클래스는 인증만을위한 것임을 암시합니까?
Sam

@Sam, 질문에서 알 수 있듯이 필터 및 경로와 같은 다른 구성에도 Startup이 사용되지 않습니다.
dmatson

33

전체 단계를 찾는 사람들을 위해 : OWIN 기반의 IIS 호스팅 웹 API를 만들려면 다음 단계를 수행하십시오.

  1. File -> New -> Project
  2. 대화에서 Installed -> templates -> Other Project types -> Visual Studio Solutions -> Blank Solution targeting .NET 4.6
  3. 솔루션에서 마우스 오른쪽 버튼을 클릭하고 추가 Project -> Web -> ASP.NET Web Application(타겟팅 .NET 4.6)

    3.1 이제 ASP.NET 4.5 템플릿에서 템플릿으로 비어 있음을 선택하십시오.

    3.2 이렇게하면 두 개의 nuget 패키지가있는 빈 솔루션이 생성됩니다.

    Microsoft.CodeDom.Providers.DotNetCompilerPlatform v 1.0.0
    Microsoft.Net.Compilers v 1.0.0
  4. 다음 패키지를 설치하십시오.

    Install-Package Microsoft.AspNet.WebApi.WebHost -Version 5.2.3
    Install-Package Microsoft.AspNet.WebApi -Version 5.2.3
    Install-Package WebApiContrib.Formatting.Razor 2.3.0.0

OWIN의 경우 :

Install-Package Microsoft.Owin.Host.SystemWeb 
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost    

그런 다음 Configuration 메소드를 사용하여 Startup.cs를 추가하십시오.

[assembly:OwinStartup(typeof(namespace.Startup))]
public class Startup
    {
        /// <summary> Configurations the specified application. </summary>
        /// <param name="app">The application.</param>
        public static void Configuration(IAppBuilder app)
        {
            var httpConfiguration = CreateHttpConfiguration();

            app
                .UseWebApi(httpConfiguration);
        }

        /// <summary> Creates the HTTP configuration. </summary>
        /// <returns> An <see cref="HttpConfiguration"/> to bootstrap the hosted API </returns>
        public static HttpConfiguration CreateHttpConfiguration()
        {
            var httpConfiguration = new HttpConfiguration();
            httpConfiguration.MapHttpAttributeRoutes();

            return httpConfiguration;
        }
}

이제에서 상속받은 클래스를 추가하고 속성과 액션 메소드로 ApiController주석을 달고 (이후에 Http 동사를 나타냄) 가야합니다.RoutePrefixRoute + HttpGet/PutPost


1
감사합니다 @dotnetguy !!! Global.asax를 완전히 제거하려고했지만 할 수 없었습니다. 마침내 당신의 단계를 따르면, 그것은 나를 위해 일했습니다. 필자의 경우 누락 된 부분은 Install-Package Microsoft.AspNet.WebApi.OwinSelfHostAPI에 추가하면 global.asax를 삭제할 수 있다는 것입니다.
yyardim

2
@yyardim OwinSelfHost는 global.asax 파일과 관련이 없다고 생각합니다. Windows 서비스와 같이 iis 외부에서 응용 프로그램을 호스팅하는 옵션 만 제공합니다.
Alexander Derck

@dotnetguy Install-Package WebApiContrib.Formatting.Razor 2.3.0.0는 설치 패키지를 찾을 수 없음 오류를 표시합니다. Install-Package WebApiContrib.Formatting.Razor 2.3.0마지막 패키지 없이이 패키지를 설치 했습니다 .0
Dairo

1
@dotnetguy이 [assembly:OwinStartup(typeof(namespace.Startup))]부분은 네임 스페이스 부분 위에 있어야합니다. 그렇지 않으면 다음 오류가 발생합니다.Assembly and module attributes must precede all other elements defined in a file except using clauses and extern alias declarations.
Dairo

16

이것은 웹 응용 프로그램의 시작 / 호스팅이 진화하기가 어려워서 어떻게 발전했는지에 대한 나의 이해입니다. 작은 요약 :

1. 클래식 ASP.NET : 필수 IIS 파이프 라인의 마지막 단계에서 실행할 응용 프로그램 코드 만 작성하십시오.

2. OWIN이 포함 된 ASP.NET : .NET 웹 서버를 구성하고 응용 프로그램 코드를 작성하십시오. 더 이상 IIS에 직접 연결되지 않으므로 더 이상 사용하지 않아도됩니다.

3. ASP.NET Core : 응용 프로그램 코드를 사용하고 작성하도록 호스트와 웹 서버를 모두 구성하십시오. 전체 .NET Framework 대신 .NET Core를 대상으로하는 경우 더 이상 .NET 웹 서버를 사용하도록 요구하지 않습니다.


이제 어떻게 작동하는지와 어떤 클래스가 응용 프로그램을 시작하는 데 사용되는지 자세히 설명하겠습니다.

클래식 ASP.NET

클래식 ASP.NET 응용 프로그램은 Global.asax파일을 진입 점으로 사용합니다. 이러한 응용 프로그램은 IIS에서만 실행될 수 있으며 코드는 IIS 파이프 라인 끝에서 실행됩니다 (따라서 IIS는 CORS, 인증, 코드 실행 전에 코드를 담당합니다). IIS 7부터 ASP.NET 런타임을 IIS에 통합하는 통합 모드에서 응용 프로그램을 실행할 수 있습니다. 이것은 가능하지 않았다 구성 기능에 코드를 가능하게하기 전에 (또는 유일한 IIS 자체)과 같은 URL을 다시 작성Application_Start당신의 사건 Global.asax파일이나 새로운 사용 <system.webserver>섹션을 당신의web.config 파일.

OWIN이 포함 된 ASP.NET

우선 OWIN 은 라이브러리가 아니라 .NET 웹 서버 (예 : IIS)가 웹 응용 프로그램과 상호 작용하는 방식에 대한 사양입니다. Microsoft 자체는 프로젝트 Katana (여러 가지 다른 NuGet 패키지를 통해 배포 됨)라는 OWIN 구현을 보유하고 있습니다 . 이 구현은 클래스 IAppBuilder에서 발생 하는 인터페이스 Startup와 Microsoft에서 제공하는 일부 OWIN 미들웨어 구성 요소 (OMC)를 제공합니다. 사용IAppBuilder기본적으로 IIS 파이프 라인에 연결되지 않고 웹 서버에 대한 파이프 라인 (위의 포인트에서와 같이 IIS7 +의 ASP.NET 파이프 라인 만 추가)을 작성하는 플러그 앤 플레이 방식으로 미들웨어를 구성합니다 (그러나 이제는 CORS 용 미들웨어 구성 요소, 인증 용 미들웨어 구성 요소 ...). 이로 인해 응용 프로그램은 더 이상 IIS에 특별히 연결되지 않으며 다음과 같이 .NET 웹 서버에서 실행할 수 있습니다.

  • OwinHost의 패키지는 카타나 웹 서버와 응용 프로그램 자체 호스트로 사용할 수 있습니다.
  • Microsoft.Owin.Host.SystemWeb의 패키지는 내부적으로 올바른 수명 이벤트에 미들웨어를 가입하여, 통합 모드에 IIS7 +에서 OWIN 응용 프로그램을 호스트하는 데 사용됩니다.

모든 것을 혼란스럽게 만드는 것은 Global.asax여전히 OWIN Startup클래스 와 함께 지원되며 둘 다 비슷한 일을 할 수 있다는 것입니다. 예를 들어, 당신은에서 CORS 구현할 수 Global.asax된다 OWIN 미들웨어 사용 및 인증을 정말 혼란을.

경험상 OWIN을 추가해야 할 때마다 Global.asax파일 을 모두 제거하는 것이 Startup좋습니다.

ASP.NET 코어

ASP.NET Core는 차세대 기술이며 이제 .NET Core 또는 전체 .NET Framework를 대상으로 지정할 수 있습니다. .NET Core를 대상으로하면 .NET 표준을 지원하는 모든 호스트에서 응용 프로그램을 실행할 수 있습니다. 즉, 더 이상 .NET 웹 서버로 제한되지 않지만 Docker 컨테이너, Linux 웹 서버, IIS에서 응용 프로그램을 호스팅 할 수 있습니다 ...

ASP.NET Core 웹 응용 프로그램의 진입 점은 Program.cs파일입니다. 여기서 호스트를 구성하고 Startup파이프 라인을 구성 할 클래스를 다시 지정하십시오 . IAppBuilder.UseOwin확장 방법 을 사용하여 OWIN을 사용하는 것은 선택 사항이지만 완전히 지원됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.