c# iis - Benötige ich eine Global.asax.cs-Datei, wenn ich eine OWIN Startup.cs-Klasse verwende und die gesamte Konfiguration dorthin verschiebe?




microsoft katana (3)

Startup.Configuration wird etwas später als Application_Start aufgerufen, aber ich glaube nicht, dass der Unterschied in den meisten Fällen eine Rolle spielt.

Ich glaube, die Hauptgründe, warum wir den anderen Code in Global.asax behalten haben, sind:

  1. Konsistenz mit früheren Versionen von MVC. (Dort erwartet derzeit jeder, diesen Code zu finden.)
  2. Möglichkeit, weitere Ereignishandler hinzuzufügen. In Global.asax können Sie mit anderen Methoden wie Session_Start und Application_Error umgehen.
  3. Korrektheit in einer Vielzahl von Authentifizierungsszenarien. Die Startup.Configuration-Methode wird nur aufgerufen, wenn Sie Microsoft.Owin.Host.SystemWeb.dll in Ihrem bin-Verzeichnis haben. Wenn Sie dieses DLL entfernen, hört es automatisch auf, Startup.Configuration aufzurufen, was schwer zu verstehen sein kann.

Ich denke, der dritte Grund ist der wichtigste. Wir haben diesen Ansatz nicht standardmäßig gewählt, da einige Szenarien nicht diese DLL enthalten, und es ist schön, in der Lage zu sein, Authentifizierungsansätze zu ändern, ohne den Ort zu verändern, an dem Code ohne Bezug ist Routenregistrierung) platziert.

Aber wenn keiner dieser Gründe in Ihrem Szenario zutrifft, denke ich, dass es Ihnen gut gehen würde, diesen Ansatz zu verwenden.

Global.asax.cs in einer brandneuen ASP.NET MVC 5-Anwendung, die aus der Vorlage "MVC w / Individual Accounts" erstellt wurde, lösche ich die Klasse Global.asax.cs und verschiebe ihren Konfigurationscode wie folgt auf die Methode Startup.cs Configuration() . Was sind die Nachteile?

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

Die Vorteile für mich sind, dass wenn ich ASP.NET 4-Anwendungen auf ASP.NET 5 aktualisiere und Teile verwende, die jetzt in der Startup.cs-Klasse konfiguriert werden müssen, keine Abhängigkeitsinjektion und andere Konfiguration in zwei verschiedenen Klassen, die miteinander verwandt zu sein scheinen zu starten und Konfiguration.


Für diejenigen, die nach den vollständigen Schritten suchen: Wenn Sie eine OWIN-basierte, von IIS gehostete Web-API erstellen möchten, sollten diese Schritte Sie dorthin führen:

  1. File -> New -> Project
  2. Im Dialog, Installed -> templates -> Other Project types -> Visual Studio Solutions -> Blank Solution targeting .NET 4.6
  3. Klicken Sie mit der rechten Maustaste auf die Project -> Web -> ASP.NET Web Application , und fügen Sie Project -> Web -> ASP.NET Web Application (für .NET 4.6) hinzu.

    3.1 Jetzt Wählen Sie in den ASP.NET 4.5-Vorlagen Leer als Vorlage aus

    3.2 Dies erstellt eine leere Lösung mit zwei nugget-Paketen:

    Microsoft.CodeDom.Providers.DotNetCompilerPlatform v 1.0.0
    Microsoft.Net.Compilers v 1.0.0
    
  4. Installiere die folgenden Pakete:

    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
    

Für OWIN:

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

Fügen Sie dann Startup.cs mit der Konfigurationsmethode hinzu:

[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 Sie nun eine Klasse hinzu, die von ApiController erbt, versehen Sie sie mit dem RoutePrefix Attribut und der Aktionsmethode mit Route + HttpGet/PutPost (repräsentiert das Route + HttpGet/PutPost Verb, nach dem Sie Route + HttpGet/PutPost ) und Sie sollten gut sein


Probieren Sie es aus.

    public static Dictionary<string, object> ObjectToDictionary(object obj)
    {
        Dictionary<string, object> ret = new Dictionary<string, object>();

        foreach (PropertyInfo prop in obj.GetType().GetProperties())
        {
            string propName = prop.Name;
            var val = obj.GetType().GetProperty(propName).GetValue(obj, null);
            if (val != null)
            {
                ret.Add(propName, val.ToString());
            }
            else
            {
                ret.Add(propName, null);
            }
        }

        return ret;
    }




c# asp.net asp.net-mvc asp.net-mvc-5 owin