OWIN Startup.cs sınıfını kullanıyorsam ve tüm yapılandırmayı oraya taşırsam Global.asax.cs dosyasına ihtiyacım var mı?


198

Diyelim ki Bireysel Hesaplar şablonuyla MVC'den yapılan yepyeni bir ASP.NET MVC 5 uygulamasında, Global.asax.cssınıfı silip yapılandırma kodunu Startup.cs Configuration()aşağıdaki gibi yönteme taşırsam, dezavantajları nelerdir?

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);
    }
}

Benim için olumsuz yanı, ASP.NET 4 uygulamalarını ASP.NET 5'e yükseltirken ve şimdi Startup.cs sınıfında yapılandırılması gereken parçaları kullanırken, bağımlılık enjeksiyonunu ve ilgili görünen iki farklı sınıfta diğer yapılandırmayı yapmıyorum başlatma ve yapılandırma.


AreaRegistration.RegisterAllAreas();Bu yöntemin başlatma sırasında bu şekilde kullanılmasına izin verilmediğinden, benim için bir hataya neden oldu Application_Start. Ancak, uygulamam bir API ve görünüşe göre bu yöntem yalnızca MVC uygulamaları için kullanışlıdır: stackoverflow.com/questions/18404637/…
Harvey

Yanıtlar:


172

Startup.Configuration, Application_Start'tan biraz daha geç çağrılır, ancak çoğu durumda farkın çok önemli olacağını düşünmüyorum.

Global.asax diğer kodu tutmak ana nedenleri olduğuna inanıyorum:

  1. MVC'nin önceki sürümleriyle tutarlılık. (Şu anda herkes bu kodu bulmayı bekliyor.)
  2. Diğer olay işleyicileri ekleme özelliği. Global.asax içinde Session_Start ve Application_Error gibi diğer yöntemleri de kullanabilirsiniz.
  3. Çeşitli kimlik doğrulama senaryolarında doğruluk. Startup.Configuration yöntemi, yalnızca bin dizininizde Microsoft.Owin.Host.SystemWeb.dll varsa çağrılır. Bu DLL kaldırırsanız, sessizce Startup.Configuration çağırmayı durduracak, bu da anlaşılması zor olabilir.

Üçüncü neden, varsayılan olarak bu yaklaşımı almadığımız en önemli şeydir, çünkü bazı senaryolar bu DLL'e sahip olmayı içermez ve ilgili olmayan kodun (geçersiz olduğu) konumu geçersiz kılmadan kimlik doğrulama yaklaşımlarını değiştirebilmek güzel rota kaydı) yerleştirilir.

Ancak bu nedenlerden hiçbiri senaryonuzda geçerli değilse, bu yaklaşımı kullanmanın iyi olacağını düşünüyorum.


19
Startup.Configuration () kullanmanın bir başka avantajı, yalnızca 1 satır kodlu owin self-host'u kullanarak web sitenizi kolayca barındırabilmenizdir: WebApp.Start <Startup> (" localhost: 3001 /" ) asp.net/web-api/ genel bakış / hosting-aspnet-web-api /… Özellikle entegrasyon testleri yazmak için kullanışlıdır
Boris Lipschitz

17
"Sessizce Startup.Configuration'ı çağırmayı durdur" yan etkisini önlemek için, ad kuralına güvenmek yerine OWIN başlangıcı için kullanılacak türü açıkça belirten bir web.config appSettings anahtarı "owin: appStartup" ekleyebilirsiniz. yukarı Bak. Bu, farklı ortamlar için farklı yapılandırmaları desteklemek için de kullanışlıdır (dev / test / prod)
Thiago Silva

2
# 3 için +1. Ben boş bir şablon ASP.NET web sitesi oluşturdu ve WebApi.Owinnuget paketi ekledim bu yüzden bir Web API yalın bir başlangıç ​​istedim . Yanlış bağımlılık IIS çalıştırmak için her şeyi dahil etmek bekleniyor. İlk başta IIS bağımlılığını ayırmak için bir Owin başlangıcı istediğimi düşündüm.
Pluc

@dmatson Son ifadenizle temel olarak Startup sınıfının yalnızca kimlik doğrulama amaçlı olduğunu mu ima ediyorsunuz?
Sam

@Sam, sorunun gösterdiği gibi filtreler ve rotalar gibi diğer yapılandırmalar için de Başlangıç ​​kullanılmaz.
dmatson

33

Tam adımları arayanlar için: OWIN tabanlı, IIS tarafından barındırılan bir web API'si oluşturmak istiyorsanız, bu adımlar sizi oraya götürmelidir:

  1. File -> New -> Project
  2. Diyalogda, Installed -> templates -> Other Project types -> Visual Studio Solutions -> Blank Solution targeting .NET 4.6
  3. Çözümde, sağ tıklayın, ekleyin Project -> Web -> ASP.NET Web Application(.NET 4.6'u hedefleme)

    3.1 Şimdi ASP.NET 4.5 şablonlarında, şablon olarak Boşalt'ı seçin

    3.2 Bu, iki nuget paketi ile boş bir çözüm oluşturur:

    Microsoft.CodeDom.Providers.DotNetCompilerPlatform v 1.0.0
    Microsoft.Net.Compilers v 1.0.0
  4. Aşağıdaki paketleri yükleyin:

    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 için:

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

Ardından Configurationup ile Startup.cs dosyasını ekleyin:

[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;
        }
}

Şimdi miras alan bir sınıf ekleyin ApiController, RoutePrefixözniteliğe ek açıklama ekleyin ve eylem yöntemiyle Route + HttpGet/PutPost(peşinde olduğunuz Http fiilini temsil eder) ve gitmekte fayda var.


1
Teşekkür ederim @dotnetguy !!! Global.asax'tan tamamen kurtulmaya çalışıyorum ama başaramadım. Sonunda adımlarını takip etmek, benim için çalıştı. Benim durumumdaki eksik kısım, Install-Package Microsoft.AspNet.WebApi.OwinSelfHostAPI'ma eklediğimde global.asax'ı silebildiğim referanstı .
yyardim

2
@yyardim Bence OwinSelfHost'un global.asax dosyasıyla pek bir ilgisi yok, sadece uygulamanızı örneğin iis dışında, örneğin bir Windows hizmetinde barındırma seçeneği sunuyor
Alexander Derck

@ dotnetguy Install-Package WebApiContrib.Formatting.Razor 2.3.0.0bir yükleme paketi bulunamadı hatasını gösterir. Bu paketin Install-Package WebApiContrib.Formatting.Razor 2.3.0en son olmadan çalışmasını sağladık.
Dairo

1
@dotnetguy [assembly:OwinStartup(typeof(namespace.Startup))]Parça, ad alanı parçasının üstünde olmalıdır, aksi takdirde şu hatayı verirAssembly and module attributes must precede all other elements defined in a file except using clauses and extern alias declarations.
Dairo

16

Bu bir web uygulaması başlatmak / barındırma nasıl takip etmek oldukça kafa karıştırıcı olduğu için nasıl gelişti anlayışım. Küçük bir özet:

1. Klasik ASP.NET: Yalnızca zorunlu IIS kanalının son adımında çalıştırılacak uygulama kodunu yazın

2. OWIN'li ASP.NET: Bir .NET web sunucusu yapılandırın ve uygulama kodunuzu yazın. Artık doğrudan IIS ile eşleşmediği için artık kullanmak zorunda değilsiniz.

3. ASP.NET Core: Ana makineyi ve web sunucusunu uygulama kodunuzu kullanacak ve yazacak şekilde yapılandırın. Tam .NET Framework yerine .NET Core'u hedeflerseniz bir .NET web sunucusu kullanmak zorunlu değildir.


Şimdi nasıl çalıştığına ve uygulamayı başlatmak için hangi sınıfların kullanıldığına dair biraz daha ayrıntıya gireceğim:

Klasik ASP.NET

Klasik ASP.NET uygulamalarında Global.asaxdosya giriş noktası olarak bulunur. Bu uygulamalar yalnızca IIS'de çalıştırılabilir ve kodunuz IIS kanalının sonunda yürütülür (bu nedenle IIS, kodunuz çalışmaya başlamadan önce CORS, kimlik doğrulamasından ... sorumludur). IIS 7'den beri uygulamanızı ASP.NET çalışma zamanını IIS'ye entegre eden tümleşik modda çalıştırabilirsiniz. Bu mümkün değildi yapılandırmak işlevselliği için kodunuzu sağlayan önce gibi (ya da yalnızca IIS kendisi) url yeniden yazma içinde Application_Startsenin durumunda Global.asaxdosya veya yeni kullanmak <system.webserver>sizin bölümüne web.configdosyası.

OWIN'li ASP.NET

Her şeyden önce OWIN bir kütüphane değil, .NET web sunucularının (örneğin IIS) web uygulamalarıyla nasıl etkileşime girdiğinin bir özelliğidir. Microsoft, Katana adlı bir OWIN uygulamasına sahiptir (birkaç farklı NuGet paketiyle dağıtılır). Bu uygulama, IAppBuilderbir Startupsınıfta karşılaştığınız arabirimi ve Microsoft tarafından sağlanan bazı OWIN ara katman bileşenleri (OMC) sağlar. kullanmaIAppBuildertemel olarak, IIS sunucusuna bağlanmak yerine web sunucusu için boru hattı oluşturmak için (yukarıdaki noktada olduğu gibi yalnızca IIS7 + 'daki ASP.NET boru hattına ek olarak) ara katman yazılımını bir tak ve çalıştır yöntemiyle oluşturursunuz (ancak şimdi CORS için bir ara katman bileşeni, kimlik doğrulama için bir ara katman bileşeni ...). Bu nedenle, uygulamanız artık IIS ile özel olarak eşleşmemiştir ve herhangi bir .NET Web sunucusunda çalıştırabilirsiniz, örneğin:

  • OwinHost paketi Katana web sunucusu sayesinde uygulama kendini ana kullanılabilir.
  • Microsoft.Owin.Host.SystemWeb paket içten doğru ömür boyu olaylara sizin ortakatmanını abone olarak, entegre modda IIS7 + daki Owin uygulamasını barındırmak için kullanılır.

Her şeyi bu kadar kafa karıştırıcı yapan şey, her ikisi de benzer şeyler yapabiliyorken Global.asax, OWIN Startupsınıfıyla birlikte desteklenmesidir . Örneğin Global.asax, gerçekten kafa karıştırıcı olan OWIN ara katman yazılımını kullanarak CORS'yi ve kimlik doğrulamasını uygulayabilirsiniz .

Genel kuralım, OWIN eklemem gerektiğinde Global.asaxkullanmak için dosyayı tamamen kaldırmaktır Startup.

ASP.NET Çekirdeği

ASP.NET Core bir sonraki evrimdir ve şimdi .NET Core veya tam .NET Framework'ü hedefleyebilirsiniz. .NET Core'u hedeflediğinizde, uygulamanızı .NET Standard'ı destekleyen herhangi bir ana bilgisayarda çalıştırabilirsiniz. Bu, artık bir .NET web sunucusu ile sınırlı olmadığınız anlamına gelir (önceki noktada olduğu gibi), ancak uygulamanızı Docker kapsayıcılarında, bir linux web sunucusunda, IIS'de barındırabilirsiniz ...

Bir ASP.NET Core web uygulaması için giriş noktası Program.csdosyadır. Burada ana makinenizi yapılandırırsınız ve yine Startupboru hattınızı yapılandırdığınız sınıfınızı belirtirsiniz . OWIN ( IAppBuilder.UseOwinuzatma yöntemini kullanarak ) kullanmak isteğe bağlıdır, ancak tam olarak desteklenmektedir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.