Apakah saya memerlukan file Global.asax.cs sama sekali jika saya menggunakan kelas OWIN Startup.cs dan memindahkan semua konfigurasi di sana?

197

Katakanlah misalnya dalam aplikasi ASP.NET MVC 5 baru yang dibuat dari MVC dengan templat Akun Perorangan, jika saya menghapus Global.asax.cskelas dan memindahkan kode konfigurasinya ke Startup.cs Configuration()metode sebagai berikut, apa kerugiannya?

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

Keuntungannya bagi saya adalah ketika meningkatkan aplikasi ASP.NET 4 ke ASP.NET 5 dan menggunakan potongan-potongan yang sekarang harus dikonfigurasi di kelas Startup.cs, saya tidak melakukan injeksi ketergantungan dan konfigurasi lainnya di dua kelas berbeda yang tampaknya terkait untuk memulai, dan konfigurasi.

iliketocode
sumber
AreaRegistration.RegisterAllAreas();Menyebabkan kesalahan bagi saya karena metode ini tidak diizinkan untuk digunakan selama startup seperti ini, hanya di Application_Start. Namun, aplikasi saya adalah API dan metode ini tampaknya hanya berguna untuk aplikasi MVC: stackoverflow.com/questions/18404637/…
Harvey

Jawaban:

171

Startup.Configuration dipanggil sedikit lebih lambat daripada Application_Start, tapi saya rasa perbedaannya tidak akan terlalu berarti dalam kebanyakan kasus.

Saya percaya alasan utama kami menyimpan kode lain di Global.asax adalah:

  1. Konsistensi dengan versi MVC sebelumnya. (Di situlah semua orang saat ini mengharapkan untuk menemukan kode ini.)
  2. Kemampuan untuk menambahkan penangan acara lainnya. Di Global.asax, Anda dapat menangani metode lain seperti Session_Start dan Application_Error.
  3. Ketepatan dalam berbagai skenario otentikasi. Metode Startup.Configuration hanya dipanggil jika Anda memiliki Microsoft.Owin.Host.SystemWeb.dll di direktori bin Anda. Jika Anda menghapus DLL ini, diam-diam akan berhenti memanggil Startup.Configuration, yang mungkin sulit dimengerti.

Saya pikir alasan ketiga adalah yang paling penting yang kami tidak mengambil pendekatan ini secara default, karena beberapa skenario tidak termasuk memiliki DLL ini, dan itu baik untuk dapat mengubah pendekatan otentikasi tanpa memvalidasi lokasi di mana kode yang tidak terkait (seperti pendaftaran rute) ditempatkan.

Tetapi jika tidak ada alasan yang berlaku dalam skenario Anda, saya pikir Anda akan baik-baik saja menggunakan pendekatan ini.

dmatson
sumber
19
Keuntungan lain menggunakan Startup.Configuration () adalah Anda dapat dengan mudah meng-host situs web Anda menggunakan owin self-host dengan hanya 1 baris kode: WebApp.Start <Startup> (" localhost: 3001 /" ) asp.net/web-api/ ikhtisar / hosting-aspnet-web-api / ... Ini sangat berguna untuk menulis tes integrasi
Boris Lipschitz
16
Untuk mencegah efek samping "hentikan panggilan Startup.Configuration", Anda dapat menambahkan kunci web.config appSettings "owin: appStartup" yang secara eksplisit menentukan jenis yang akan digunakan untuk startup OWIN, alih-alih mengandalkan konvensi nama. menengadah. Ini juga berguna untuk mendukung konfigurasi yang berbeda untuk lingkungan yang berbeda (dev / test / prod)
Thiago Silva
2
+1 untuk # 3. Saya ingin memulai lean ke Web API jadi saya membuat template kosong situs web ASP.NET dan menambahkan WebApi.Owinpaket nuget. Saya keliru mengharapkan ketergantungan untuk memasukkan semuanya untuk dijalankan di IIS. Tidak tahu mengapa saya berpikir bahwa karena saya ingin startup Owin untuk melepaskan ketergantungan IIS di tempat pertama.
Pluc
@dmatson Dengan pernyataan terakhir Anda, pada dasarnya Anda menyiratkan bahwa kelas Startup hanya dimaksudkan untuk otentikasi?
Sam
@ Sam, tidak ada Startup yang digunakan untuk konfigurasi lain juga, seperti filter dan rute, seperti yang ditunjukkan pertanyaan.
dmatson
33

Bagi mereka yang mencari langkah-langkah lengkap: Jika Anda mencari untuk membuat API web berbasis OWIN, IIS host, langkah-langkah ini akan membawa Anda ke sana:

  1. File -> New -> Project
  2. Dalam dialog, Installed -> templates -> Other Project types -> Visual Studio Solutions -> Blank Solution targeting .NET 4.6
  3. Pada solusinya, klik kanan, tambahkan Project -> Web -> ASP.NET Web Application(penargetan .NET 4.6)

    3.1 Sekarang Di templat ASP.NET 4.5, pilih Kosong sebagai templat

    3.2 Ini menciptakan solusi kosong dengan dua paket nuget:

    Microsoft.CodeDom.Providers.DotNetCompilerPlatform v 1.0.0
    Microsoft.Net.Compilers v 1.0.0
  4. Instal paket-paket berikut:

    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

Untuk OWIN:

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

Kemudian tambahkan Startup.cs dengan metode Konfigurasi:

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

Sekarang tambahkan kelas yang mewarisi dari ApiController, beri catatan dengan RoutePrefixatribut dan metode tindakan dengan Route + HttpGet/PutPost(mewakili kata kerja Http Anda setelah) dan Anda harus baik untuk pergi

Sudhanshu Mishra
sumber
1
@Dotnetguy terima kasih !!! Saya telah berusaha untuk menyingkirkan Global.asax sepenuhnya tetapi tidak mampu. Akhirnya mengikuti langkah Anda, itu berhasil bagi saya. Bagian yang hilang dalam kasus saya adalah referensi untuk Install-Package Microsoft.AspNet.WebApi.OwinSelfHostSetelah saya menambahkannya ke api saya, saya dapat menghapus global.asax.
yyardim
2
@ Yyardim Saya pikir OwinSelfHost tidak ada hubungannya dengan file global.asax, itu hanya memberi Anda pilihan untuk meng-host aplikasi Anda di luar iis, dalam layanan windows misalnya
Alexander Derck
@dnetnetguy Install-Package WebApiContrib.Formatting.Razor 2.3.0.0menunjukkan paket-instal tidak ditemukan kesalahan. Dapat menginstal paket ini Install-Package WebApiContrib.Formatting.Razor 2.3.0, dengan tanpa yang terakhir.0
Dairo
1
@dotnetguy Bagian [assembly:OwinStartup(typeof(namespace.Startup))]harus di atas bagian namespace kalau tidak memberikan kesalahan berikutAssembly and module attributes must precede all other elements defined in a file except using clauses and extern alias declarations.
Dairo
16

Ini adalah pemahaman saya tentang bagaimana memulai / hosting aplikasi web berkembang karena itu semua cukup membingungkan untuk diikuti. Ringkasan kecil:

1. Classic ASP.NET: Tuliskan hanya kode aplikasi untuk dijalankan pada langkah terakhir dari pipa IIS wajib

2. ASP.NET dengan OWIN: Konfigurasikan server web .NET dan tulis kode aplikasi Anda. Tidak lagi secara langsung digabungkan ke IIS, jadi Anda tidak lagi dipaksa untuk menggunakannya.

3. ASP.NET Core: Konfigurasikan host dan server web untuk menggunakan dan menulis kode aplikasi Anda. Tidak lagi wajib untuk menggunakan server .NET jika Anda menargetkan .NET Core alih-alih .NET Framework.


Sekarang saya akan sedikit lebih detail tentang cara kerjanya dan kelas mana yang digunakan untuk memulai aplikasi:

ASP.NET klasik

Aplikasi ASP.NET klasik memiliki Global.asaxfile sebagai titik masuk. Aplikasi ini hanya dapat dijalankan di IIS dan kode Anda dieksekusi di akhir pipa IIS (jadi IIS bertanggung jawab untuk CORS, otentikasi ... sebelum kode Anda berjalan). Sejak IIS 7 Anda dapat menjalankan aplikasi Anda dalam mode terintegrasi yang mengintegrasikan runtime ASP.NET ke IIS. Hal ini memungkinkan kode untuk fungsi configure yang tidak mungkin dilakukan sebelumnya (atau hanya dalam IIS sendiri) seperti url menulis ulang dalam Application_Startacara Anda Global.asaxfile atau menggunakan baru <system.webserver>bagian dalam Anda web.configberkas.

ASP.NET dengan OWIN

Pertama-tama OWIN bukan perpustakaan tetapi spesifikasi tentang bagaimana .NET web server (misalnya IIS) berinteraksi dengan aplikasi web. Microsoft sendiri memiliki implementasi OWIN yang disebut proyek Katana (didistribusikan melalui beberapa paket NuGet yang berbeda). Implementasi ini memberikan Anda pada dasarnya menyusun middleware dengan cara plug-and-play untuk membuat pipa untuk server web (selain hanya pipa ASP.NET di IIS7 + seperti pada poin di atas) daripada diikat ke pipa IIS ( tetapi sekarang Anda menggunakan komponen middleware untuk CORS, komponen middleware untuk otentikasi ...). Karena itu, aplikasi Anda tidak secara khusus digabungkan ke IIS dan Anda dapat menjalankannya di .server Web NET, misalnya:IAppBuilder antarmuka yang Anda temui di Startupkelas dan beberapa komponen middleware OWIN (OMC) yang disediakan oleh Microsoft. MenggunakanIAppBuilder

  • The OwinHost paket dapat digunakan untuk diri host-aplikasi Anda dengan webserver Katana.
  • The Microsoft.Owin.Host.SystemWeb paket digunakan untuk host aplikasi Owin Anda di IIS7 + dalam modus terpadu, dengan berlangganan middleware untuk acara seumur hidup yang benar secara internal.

Hal yang membuat semuanya sangat membingungkan adalah yang Global.asaxmasih didukung bersama dengan Startupkelas OWIN , sementara mereka berdua dapat melakukan hal serupa. Misalnya Anda dapat menerapkan CORS Global.asaxdan otentikasi menggunakan middleware OWIN yang menjadi sangat membingungkan.

Aturan praktis saya adalah menghapus semua Global.asaxfile yang mendukung penggunaan Startupkapan pun saya perlu menambahkan OWIN.

ASP.NET Core

ASP.NET Core adalah evolusi berikutnya dan sekarang Anda dapat menargetkan .NET Core atau .NET Framework. Ketika Anda menargetkan .NET Core, Anda dapat menjalankan aplikasi pada host apa pun yang mendukung .NET Standard. Ini berarti Anda tidak lagi terbatas pada server .NET (seperti pada poin sebelumnya), tetapi dapat meng-host aplikasi Anda dalam wadah Docker, server web linux, IIS ...

Titik masuk untuk aplikasi web ASP.NET Core adalah Program.csfile. Di sana Anda mengkonfigurasi host Anda dan sekali lagi menentukan Startupkelas Anda di mana Anda mengkonfigurasi pipa Anda. Menggunakan OWIN (dengan menggunakan IAppBuilder.UseOwinmetode ekstensi) adalah opsional, tetapi didukung penuh .

Alexander Derck
sumber