Tôi có cần một tệp Global.asax.cs không nếu tôi đang sử dụng lớp OWIN Startup.cs và di chuyển tất cả cấu hình ở đó?


197

Ví dụ, giả sử trong một ứng dụng ASP.NET MVC 5 hoàn toàn mới được tạo từ mẫu MVC với các Tài khoản Cá nhân, nếu tôi xóa Global.asax.cslớp và di chuyển mã cấu hình của nó sang Startup.cs Configuration()phương thức như sau, thì nhược điểm là gì?

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

Ưu điểm đối với tôi là khi nâng cấp các ứng dụng ASP.NET 4 lên ASP.NET 5 và sử dụng các phần hiện phải được cấu hình trong lớp Startup.cs, tôi không thực hiện tiêm phụ thuộc và cấu hình khác trong hai lớp khác nhau có vẻ liên quan để bắt đầu và cấu hình.


AreaRegistration.RegisterAllAreas();Đã gây ra lỗi cho tôi vì phương pháp này không được phép sử dụng trong quá trình khởi động như thế này, chỉ trong Application_Start. Tuy nhiên, ứng dụng của tôi là một API và phương pháp này rõ ràng chỉ hữu ích cho các ứng dụng MVC: stackoverflow.com/questions/18404637/ trộm
Harvey

Câu trả lời:


171

Startup.Configuration được gọi hơi muộn hơn Application_Start, nhưng tôi không nghĩ rằng sự khác biệt sẽ quan trọng trong hầu hết các trường hợp.

Tôi tin rằng những lý do chính khiến chúng tôi giữ mã khác trong Global.asax là:

  1. Tính nhất quán với các phiên bản trước của MVC. (Đó là nơi mọi người hiện đang mong đợi tìm thấy mã này.)
  2. Khả năng thêm các trình xử lý sự kiện khác. Trong Global.asax, bạn có thể xử lý các phương thức khác như Session_Start và Application_Error.
  3. Tính chính xác trong một loạt các kịch bản xác thực. Phương thức Startup.Configuration chỉ được gọi nếu bạn có Microsoft.Owin.Host.SystemWeb.dll trong thư mục bin của bạn. Nếu bạn loại bỏ DLL này, nó sẽ âm thầm ngừng gọi Startup.Configuration, điều này có thể khó hiểu.

Tôi nghĩ lý do thứ ba là lý do quan trọng nhất mà chúng tôi không sử dụng cách tiếp cận này theo mặc định, vì một số trường hợp không bao gồm DLL này và thật tuyệt khi có thể thay đổi cách tiếp cận xác thực mà không làm mất hiệu lực vị trí nơi mã không liên quan (như đăng ký tuyến đường) được đặt.

Nhưng nếu không có lý do nào áp dụng trong kịch bản của bạn, tôi nghĩ bạn sẽ ổn khi sử dụng phương pháp này.


19
Một ưu điểm khác của việc sử dụng Startup.Configuration () là bạn có thể dễ dàng lưu trữ trang web của mình bằng cách tự lưu trữ owin chỉ với 1 dòng mã: WebApp.Start <Startup> (" localhost: 3001 /" ) asp.net/web-api/ tổng quan / hosting-aspnet-web-api / ' Nó đặc biệt tiện dụng để viết các bài kiểm tra tích hợp
Boris Lipschitz

16
Để ngăn hiệu ứng phụ "âm thầm dừng gọi Startup.Configuration", bạn có thể thêm khóa ứng dụng web.config "owin: appStartup" chỉ định rõ ràng loại được sử dụng để khởi động OWIN, thay vì dựa vào quy ước tên tra cứu. Điều này cũng thuận tiện cho việc hỗ trợ các cấu hình khác nhau cho các môi trường khác nhau (dev / test / prod)
Thiago Silva

2
+1 cho # 3. Tôi muốn có một khởi đầu tinh gọn cho API Web vì vậy tôi đã tạo một trang web ASP.NET mẫu trống và thêm WebApi.Owingói nuget. Tôi đã dự đoán sai sự phụ thuộc sẽ bao gồm mọi thứ để chạy trên IIS. Không có lý do tại sao tôi nghĩ rằng vì tôi muốn một khởi động Owin để giải phóng sự phụ thuộc IIS ngay từ đầu.
Pluc 9/12/2015

@dmatson Với tuyên bố cuối cùng của bạn, về cơ bản bạn có nghĩa là lớp Khởi động chỉ có ý nghĩa để xác thực?
Sam

@Sam, không có Startup nào được sử dụng cho cấu hình khác, chẳng hạn như bộ lọc và tuyến đường, như câu hỏi cho thấy.
dmatson

33

Đối với những người đang tìm kiếm các bước hoàn chỉnh: Nếu bạn đang tìm cách tạo API web được lưu trữ dựa trên OWIN, IIS, các bước này sẽ đưa bạn đến đó:

  1. File -> New -> Project
  2. Trong cuộc đối thoại, Installed -> templates -> Other Project types -> Visual Studio Solutions -> Blank Solution targeting .NET 4.6
  3. Trên giải pháp, nhấp chuột phải, thêm Project -> Web -> ASP.NET Web Application(nhắm mục tiêu .NET 4.6)

    3.1 Bây giờ Trong các mẫu ASP.NET 4.5, chọn Trống làm mẫu

    3.2 Điều này tạo ra một giải pháp trống với hai gói nuget:

    Microsoft.CodeDom.Providers.DotNetCompilerPlatform v 1.0.0
    Microsoft.Net.Compilers v 1.0.0
  4. Cài đặt các gói sau:

    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

Dành cho chủ sở hữu:

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

Sau đó thêm Startup.cs với phương thức Cấu hình:

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

Bây giờ thêm một lớp kế thừa từ ApiController, chú thích nó với RoutePrefixthuộc tính và phương thức hành động với Route + HttpGet/PutPost(đại diện cho động từ http bạn đang theo sau) và bạn nên đi tiếp


1
Cảm ơn bạn @dotnetguy !!! Tôi đã cố gắng loại bỏ hoàn toàn Global.asax nhưng không thể. Cuối cùng làm theo các bước của bạn, nó làm việc cho tôi. Phần còn thiếu trong trường hợp của tôi là tài liệu tham khảo Install-Package Microsoft.AspNet.WebApi.OwinSelfHostMột khi tôi thêm nó vào api của mình, tôi đã có thể xóa global.asax.
yyardim

2
@yyardim Tôi nghĩ rằng OwinSelfhost không liên quan nhiều đến tệp global.asax, nó chỉ cung cấp cho bạn tùy chọn để lưu trữ ứng dụng của bạn bên ngoài iis, ví dụ như trong dịch vụ windows
Alexander Derck

@dotnetguy Install-Package WebApiContrib.Formatting.Razor 2.3.0.0hiển thị lỗi cài đặt không tìm thấy. Đã cài đặt gói này hoạt động với Install-Package WebApiContrib.Formatting.Razor 2.3.0, vì vậy không có lần cuối.0
Dairo

1
@dotnetguy Phần [assembly:OwinStartup(typeof(namespace.Startup))]phải nằm trên phần không gian tên nếu không nó sẽ báo lỗi sauAssembly and module attributes must precede all other elements defined in a file except using clauses and extern alias declarations.
Dairo

16

Đây là sự hiểu biết của tôi về việc bắt đầu / lưu trữ một ứng dụng web phát triển như thế nào vì nó khá khó hiểu để làm theo. Một tóm tắt nhỏ:

1. ASP.NET cổ điển: Chỉ viết mã ứng dụng để chạy ở bước cuối cùng của đường dẫn IIS bắt buộc

2. ASP.NET với OWIN: Cấu hình máy chủ web .NET và viết mã ứng dụng của bạn. Không còn được kết nối trực tiếp với IIS, vì vậy bạn không còn bị buộc phải sử dụng nó.

3. ASP.NET Core: Định cấu hình cả máy chủ và máy chủ web để sử dụng và viết mã ứng dụng của bạn. Không còn bắt buộc phải sử dụng máy chủ web .NET nếu bạn nhắm mục tiêu .NET Core thay vì .NET Framework đầy đủ.


Bây giờ tôi sẽ đi sâu hơn một chút vào chi tiết về cách thức hoạt động của nó và các lớp nào được sử dụng để khởi động ứng dụng:

ASP.NET cổ điển

Các ứng dụng ASP.NET cổ điển có Global.asaxtệp là điểm vào. Các ứng dụng này chỉ có thể được chạy trong IIS và mã của bạn được thực thi ở cuối đường dẫn IIS (vì vậy IIS chịu trách nhiệm về CORS, xác thực ... trước khi mã của bạn thậm chí chạy). Vì IIS 7, bạn có thể chạy ứng dụng của mình ở chế độ tích hợp tích hợp thời gian chạy ASP.NET vào IIS. Điều này cho phép mã của bạn định cấu hình chức năng không thể có trước đây (hoặc chỉ trong chính IIS), chẳng hạn như viết lại url trong trường Application_Starthợp Global.asaxtệp của bạn hoặc sử dụng phần mới <system.webserver>trong web.configtệp của bạn .

ASP.NET với OWIN

Trước hết OWIN không phải là một thư viện mà là một đặc điểm kỹ thuật về cách các máy chủ web .NET (ví dụ IIS) tương tác với các ứng dụng web. Bản thân Microsoft đã triển khai OWIN được gọi là dự án Katana (được phân phối thông qua một số gói NuGet khác nhau). Việc triển khai này cung cấp IAppBuildergiao diện mà bạn gặp trong một Startuplớp và một số thành phần phần mềm trung gian OWIN (OMC) do Microsoft cung cấp. Sử dụngIAppBuildervề cơ bản, bạn soạn phần mềm trung gian theo cách cắm và chạy để tạo đường ống cho máy chủ web (ngoài chỉ có đường dẫn ASP.NET trong IIS7 + như ở điểm trên) thay vì được gắn với đường dẫn IIS (nhưng giờ bạn sử dụng một thành phần phần mềm trung gian cho CORS, một thành phần phần mềm trung gian để xác thực ...). Do đó, ứng dụng của bạn không được kết nối cụ thể với IIS nữa và bạn có thể chạy nó trên bất kỳ Máy chủ web .NET nào, ví dụ:

  • Các OwinHost gói có thể được sử dụng để tự chủ ứng dụng của bạn với một máy chủ web Katana.
  • Các Microsoft.Owin.Host.SystemWeb gói được sử dụng để lưu trữ ứng dụng OWIN của bạn trong IIS7 + trong chế độ tích hợp, bằng cách đăng ký middleware của mình vào sự kiện cuộc đời đúng trong nội bộ.

Điều khiến mọi thứ trở nên khó hiểu là Global.asaxvẫn được hỗ trợ cùng với Startuplớp OWIN , trong khi cả hai đều có thể làm những việc tương tự. Ví dụ: bạn có thể triển khai CORS trong Global.asaxvà xác thực bằng phần mềm trung gian OWIN, điều này thực sự gây nhầm lẫn.

Nguyên tắc nhỏ của tôi là loại bỏ hoàn toàn các Global.asaxtập tin có lợi cho việc sử dụng Startupbất cứ khi nào tôi cần thêm OWIN.

Lõi ASP.NET

ASP.NET Core là sự phát triển tiếp theo và bây giờ bạn có thể nhắm mục tiêu .NET Core hoặc .NET Framework đầy đủ. Khi bạn nhắm mục tiêu .NET Core, bạn có thể chạy ứng dụng của mình trên bất kỳ máy chủ nào hỗ trợ .NET Standard. Điều này có nghĩa là bạn không còn bị giới hạn đối với máy chủ web .NET (như ở điểm trước), nhưng có thể lưu trữ ứng dụng của bạn trong các thùng chứa Docker, máy chủ web linux, IIS ...

Điểm vào cho một ứng dụng web ASP.NET Core là Program.cstệp. Ở đó bạn định cấu hình máy chủ của mình và một lần nữa chỉ định Startuplớp của bạn nơi bạn định cấu hình đường ống của mình. Sử dụng OWIN (bằng cách sử dụng IAppBuilder.UseOwinphương thức mở rộng) là tùy chọn, nhưng được hỗ trợ đầy đủ .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.