ฉันต้องการไฟล์ Global.asax.cs เลยหรือไม่หากฉันใช้คลาส OWIN Startup.cs และย้ายการกำหนดค่าทั้งหมดไปที่นั่น


198

ตัวอย่างเช่นในแอปพลิเคชัน ASP.NET MVC 5 ใหม่ล่าสุดที่สร้างจากเทมเพลต MVC กับบัญชีบุคคลถ้าฉันลบ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);
    }
}

Upsides สำหรับฉันคือเมื่ออัพเกรดแอปพลิเคชัน ASP.NET 4 เป็น ASP.NET 5 และการใช้ชิ้นส่วนที่ตอนนี้ต้องกำหนดค่าในคลาส Startup.cs ฉันไม่ได้พึ่งพาการฉีดและการกำหนดค่าอื่น ๆ ในสองคลาสที่แตกต่างกันซึ่งดูเหมือนว่าเกี่ยวข้องกัน เพื่อเริ่มต้นและการกำหนดค่า


AreaRegistration.RegisterAllAreas();Application_Startก่อให้เกิดข้อผิดพลาดสำหรับฉันเป็นวิธีการนี้ไม่อนุญาตให้นำมาใช้ในระหว่างการเริ่มต้นเช่นนี้เฉพาะใน อย่างไรก็ตามแอปพลิเคชันของฉันเป็น API และเห็นได้ชัดว่าวิธีการนี้มีประโยชน์สำหรับแอปพลิเคชัน MVC เท่านั้น: stackoverflow.com/questions/18404637/…
ฮาร์วีย์

คำตอบ:


172

เริ่มต้นการกำหนดค่าได้รับการเรียกช้ากว่า Application_Start เล็กน้อย แต่ฉันไม่คิดว่าความแตกต่างจะมีความสำคัญมากในกรณีส่วนใหญ่

ฉันเชื่อว่าเหตุผลสำคัญที่เราเก็บรหัสอื่นไว้ใน Global.asax คือ:

  1. ความสอดคล้องกับ MVC รุ่นก่อนหน้า (นั่นคือสิ่งที่ทุกคนคาดหวังในขณะนี้เพื่อค้นหารหัสนี้)
  2. ความสามารถในการเพิ่มตัวจัดการเหตุการณ์อื่น ๆ ใน Global.asax คุณสามารถจัดการวิธีอื่น ๆ เช่น Session_Start และ Application_Error
  3. ความถูกต้องในสถานการณ์การพิสูจน์ตัวตนที่หลากหลาย กระบวนการ Startup.Configuration จะถูกเรียกใช้เฉพาะเมื่อคุณมี Microsoft.Owin.Host.SystemWeb.dll ในไดเรกทอรีช่องเก็บของคุณ หากคุณลบ DLL นี้มันจะหยุดเรียกการตั้งค่าเริ่มต้นซึ่งอาจยากที่จะเข้าใจ

ฉันคิดว่าเหตุผลที่สามคือสิ่งที่สำคัญที่สุดที่เราไม่ได้ใช้วิธีนี้ตามค่าเริ่มต้นเนื่องจากบางสถานการณ์ไม่รวมถึงการมี DLL นี้และมันเป็นเรื่องดีที่จะสามารถเปลี่ยนวิธีการรับรองความถูกต้องโดยไม่ทำให้ตำแหน่งที่รหัสไม่เกี่ยวข้อง มีการลงทะเบียนเส้นทาง)

แต่ถ้าไม่มีเหตุผลเหล่านั้นนำมาใช้ในสถานการณ์ของคุณฉันคิดว่าคุณจะสบายดีเมื่อใช้วิธีนี้


19
ข้อดีอีกอย่างของการใช้ Startup.Configuration () คือคุณสามารถโฮสต์เว็บไซต์ของคุณได้อย่างง่ายดายโดยใช้ Owin Self-host ด้วยรหัสเพียง 1 บรรทัด: WebApp.Start <Startup> (" localhost: 3001 /" ) asp.net/web-api/ ภาพรวม / hosting-aspnet-web-api / ...มันมีประโยชน์อย่างยิ่งสำหรับการเขียนการทดสอบการรวม
Boris Lipschitz

17
เพื่อป้องกัน "หยุดการโทรแบบเงียบ ๆ เริ่มต้นการกำหนดค่า" ผลข้างเคียงคุณสามารถเพิ่มคีย์การตั้งค่า app.setig web.config "owin: appStartup" ซึ่งระบุประเภทที่จะใช้สำหรับการเริ่มต้น OWIN แทนการใช้ชื่อแบบแผน ค้นหา นอกจากนี้ยังมีประโยชน์สำหรับการสนับสนุนการกำหนดค่าที่แตกต่างกันสำหรับสภาพแวดล้อมที่แตกต่างกัน (dev / test / prod)
Thiago Silva

2
+1 สำหรับ # 3 ฉันต้องการเริ่มการทำงานแบบลีนไปที่ Web API ดังนั้นฉันจึงสร้างเว็บไซต์ ASP.NET เทมเพลตเปล่าและเพิ่มWebApi.Owinแพ็คเกจ nuget ฉันคาดหวังว่าการพึ่งพาจะรวมทุกอย่างเพื่อทำงานบน IIS อย่างไม่ถูกต้อง ไม่มีความคิดว่าทำไมฉันจึงคิดว่าตั้งแต่ฉันต้องการให้โอวินเริ่มต้นเพื่อแยกการพึ่งพา IIS ในครั้งแรก
Pluc

@dmatson ด้วยคำแถลงล่าสุดของคุณคุณได้บอกเป็นนัยว่าคลาส Startup นั้นมีไว้สำหรับการพิสูจน์ตัวตนเท่านั้น?
แซม

@Sam ไม่มีการเริ่มต้นใช้สำหรับการกำหนดค่าอื่นเช่นกันเช่นตัวกรองและเส้นทางตามที่คำถามแสดง
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 ให้เลือก Empty เป็นเทมเพลต

    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    

จากนั้นเพิ่ม 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นั้นใส่คำอธิบายประกอบด้วยRoutePrefixแอตทริบิวต์และวิธีการดำเนินการด้วยRoute + HttpGet/PutPost(แทนคำกริยา Http ที่คุณใช้อยู่) และคุณน่าจะดี


1
ขอบคุณ @dotnetguy !!! ฉันพยายามกำจัด Global.asax อย่างสมบูรณ์ แต่ไม่สามารถทำได้ ในที่สุดเมื่อทำตามขั้นตอนของคุณมันก็ใช้ได้ผลสำหรับฉัน ส่วนที่ขาดหายไปในกรณีของฉันคือการอ้างอิงถึงInstall-Package Microsoft.AspNet.WebApi.OwinSelfHostเมื่อฉันเพิ่มไปยัง API ของฉันฉันก็สามารถลบ global.asax
yyardim

2
@yyardim ฉันคิดว่า OwinSelfHost ไม่มีส่วนเกี่ยวข้องกับไฟล์ global.asax เพียงแค่ให้คุณเลือกโฮสต์แอปพลิเคชันของคุณนอก iis ในบริการ windows ตัวอย่าง
Alexander Derck

@dotnetguy Install-Package WebApiContrib.Formatting.Razor 2.3.0.0แสดงข้อผิดพลาดไม่พบการติดตั้งแพ็คเกจ มีการติดตั้งแพคเกจนี้ทำงานด้วยInstall-Package WebApiContrib.Formatting.Razor 2.3.0ดังนั้นโดยไม่ต้องผ่านล่าสุด 0
Dairo

1
@dnetnety [assembly:OwinStartup(typeof(namespace.Startup))]ส่วนที่จะต้องอยู่เหนือส่วน namespace มิฉะนั้นจะทำให้เกิดข้อผิดพลาดดังต่อไปนี้Assembly and module attributes must precede all other elements defined in a file except using clauses and extern alias declarations.
Dairo

16

นี่คือความเข้าใจของฉันว่าการเริ่มต้น / การโฮสต์เว็บแอปพลิเคชันมีวิวัฒนาการอย่างไร สรุปเล็ก ๆ :

1. Classic ASP.NET:เขียนเฉพาะรหัสแอปพลิเคชั่นที่จะทำงานในขั้นตอนสุดท้ายของขั้นตอน IIS บังคับ

2. ASP.NET ด้วย OWIN:กำหนดค่าเว็บเซิร์ฟเวอร์. NET และเขียนรหัสแอปพลิเคชันของคุณ ไม่เชื่อมต่อกับ IIS โดยตรงอีกต่อไปดังนั้นคุณจะไม่ถูกบังคับให้ใช้อีกต่อไป

3. ASP.NET Core:กำหนดค่าทั้งโฮสต์และเว็บเซิร์ฟเวอร์เพื่อใช้และเขียนรหัสแอปพลิเคชันของคุณ ไม่บังคับให้ใช้เว็บเซิร์ฟเวอร์. NET อีกต่อไปหากคุณกำหนดเป้าหมายเป็น. NET Core แทนที่จะเป็น. NET Framework แบบเต็ม


ตอนนี้ฉันจะอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการทำงานและคลาสที่ใช้ในการเริ่มต้นแอปพลิเคชัน:

ASP.NET คลาสสิก

แอปพลิเคชัน ASP.NET คลาสสิคมีGlobal.asaxไฟล์เป็นจุดเข้าใช้งาน แอปพลิเคชันเหล่านี้สามารถทำงานใน IIS และรหัสของคุณจะได้รับการดำเนินการในตอนท้ายของไพพ์ไลน์ IIS (ดังนั้น IIS จะรับผิดชอบ CORS, การพิสูจน์ตัวตน ... ก่อนที่โค้ดของคุณจะรัน) ตั้งแต่ IIS 7 คุณสามารถเรียกใช้แอปพลิเคชันของคุณในโหมดรวมซึ่งรวมรันไทม์ ASP.NET เข้ากับ IIS สิ่งนี้ทำให้โค้ดของคุณสามารถกำหนดค่าการทำงานที่ไม่สามารถทำได้ก่อน (หรือเฉพาะใน IIS เอง) เช่นurl rewritingในApplication_Startกรณีที่Global.asaxไฟล์ของคุณหรือใช้<system.webserver>ส่วนใหม่ในweb.configไฟล์ของคุณ

ASP.NET ด้วย OWIN

ก่อนอื่นOWINไม่ใช่ห้องสมุด แต่เป็นสเปคที่เว็บเซิร์ฟเวอร์. NET (ตัวอย่างเช่น IIS) โต้ตอบกับเว็บแอพพลิเคชัน Microsoft เองก็มีการติดตั้ง OWIN ที่เรียกว่าproject Katana (เผยแพร่ผ่านแพ็คเกจ NuGet ที่แตกต่างกัน) การใช้งานนี้ให้IAppBuilderอินเทอร์เฟซที่คุณพบในStartupคลาสและส่วนประกอบมิดเดิลแวร์ OWIN (OMC) ที่จัดทำโดย Microsoft การใช้IAppBuilderโดยทั่วไปคุณจะเขียนมิดเดิลแวร์ในแบบ plug-and-play เพื่อสร้างไปป์ไลน์สำหรับเว็บเซิร์ฟเวอร์ (นอกเหนือจากเฉพาะไปป์ไลน์ ASP.NET ใน IIS7 + ตามจุดด้านบน) แทนที่จะเชื่อมโยงกับไพพ์ของ IIS (แต่ตอนนี้คุณใช้ คอมโพเนนต์มิดเดิลแวร์สำหรับ CORS คอมโพเนนต์มิดเดิลแวร์สำหรับการพิสูจน์ตัวตน ... ) ด้วยเหตุนี้แอปพลิเคชันของคุณจึงไม่ได้เชื่อมต่อกับ IIS อีกต่อไปโดยเฉพาะและคุณสามารถเรียกใช้ได้บน. NET Webserver ใด ๆ ตัวอย่างเช่น:

  • OwinHostแพคเกจสามารถใช้เพื่อตนเองโฮสต์แอพลิเคชันของคุณกับเว็บเซิร์ฟเวอร์ Katana
  • Microsoft.Owin.Host.SystemWebแพคเกจจะใช้ในการเป็นเจ้าภาพการประยุกต์ใช้ OWIN คุณใน IIS7 + ในโหมดแบบบูรณาการโดยสมัครมิดเดิลแวร์ของคุณไปยังเหตุการณ์ที่อายุการใช้งานที่ถูกต้องภายใน

สิ่งที่ทำให้ทุกอย่างเกิดความสับสนก็Global.asaxคือยังคงได้รับการสนับสนุนพร้อมกับStartupคลาสOWIN ในขณะที่พวกเขาทั้งสองสามารถทำสิ่งที่คล้ายกัน ตัวอย่างเช่นคุณอาจดำเนินการในล ธGlobal.asaxและการตรวจสอบโดยใช้ตัวกลาง OWIN ซึ่งจะกลายเป็นจริงทำให้เกิดความสับสน

กฎง่ายๆของฉันคือการลบGlobal.asaxไฟล์ทั้งหมดเข้าด้วยกันเพื่อใช้Startupเมื่อใดก็ตามที่ฉันต้องการเพิ่ม OWIN

แกน ASP.NET

ASP.NET Core เป็นวิวัฒนาการต่อไปและตอนนี้คุณสามารถกำหนดเป้าหมายเป็น. NET Core หรือ. NET Framework แบบเต็ม เมื่อคุณกำหนดเป้าหมาย. NET Core คุณสามารถเรียกใช้แอปพลิเคชันของคุณบนโฮสต์ใดก็ได้ที่รองรับ. NET Standard ซึ่งหมายความว่าคุณไม่ได้ถูก จำกัด ให้ใช้เว็บเซิร์ฟเวอร์. NET (เหมือนในจุดก่อนหน้า) อีกต่อไป แต่สามารถโฮสต์แอปพลิเคชันของคุณในคอนเทนเนอร์ Docker, เว็บเซิร์ฟเวอร์ linux, IIS ...

จุดเริ่มต้นสำหรับแอปพลิเคชันเว็บ ASP.NET Core คือProgram.csไฟล์ มีคุณกำหนดค่าโฮสต์ของคุณและระบุStartupคลาสของคุณที่คุณกำหนดค่าไปป์ไลน์ของคุณอีกครั้ง ใช้ OWIN (โดยใช้IAppBuilder.UseOwinวิธีขยาย) เป็นตัวเลือก แต่การสนับสนุนอย่างเต็มที่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.