.Net OWIN WebApiConfig未被调用

r3p*_*ica 5 c# asp.net asp.net-web-api

我创建了一个空白项目,因此我可以创建一个角度应用程序 现在我已经完成了所有这些工作,我决定将Web API添加到此项目中.我安装了所有必需的软件包并设置了WebApiConfig.cs文件.然后我安装了OWIN并创建了OWIN Startup Class.当我运行我的项目时,正确调用OWIN启动类,但WebApiConfig不是.

在过去的使用(预OWIN)的Global.asax是你如何解雇所有配置类,但因为我使用OWINGlobal.asax的文件是不需要的,所以我从来没有创建它.

有人曾经遇到过这个并知道我做错了什么吗?

更新1

我添加了一个Global.asax页面并执行了.我的印象是,如果你使用OWIN,你应该删除你的Global.asax文件?

这是Global.asax文件

public class Global : HttpApplication
{

    protected void Application_Start()
    {
        // Add these two lines to initialize Routes and Filters:
        WebApiConfig.Register(GlobalConfiguration.Configuration);
    }
}
Run Code Online (Sandbox Code Playgroud)

Startup.Config文件.

public class StartupConfig
{
    public static UserService<User> UserService { get; set; }
    public static string PublicClientId { get; private set; }
    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

    static StartupConfig()
    {
        UserService = new UserService<User>(new UnitOfWork<DatabaseContext>(), false, true);
        PublicClientId = "self";

        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new OAuthProvider<User>(PublicClientId, UserService),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        };
    }

    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void Configuration(IAppBuilder app)
    {
        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptions);

        // Uncomment the following lines to enable logging in with third party login providers
        //app.UseMicrosoftAccountAuthentication(
        //    clientId: "",
        //    clientSecret: "");

        //app.UseTwitterAuthentication(
        //    consumerKey: "vnaJZLYwWFbv7GBlDeMbfwAlD",
        //    consumerSecret: "Q1FE1hEN6prXnK2O9TYihTFyOQmcQmrZJses0rT8Au4OsDQISQ");

        //app.UseFacebookAuthentication(
        //    appId: "",
        //    appSecret: "");

        //app.UseGoogleAuthentication();
    }
}
Run Code Online (Sandbox Code Playgroud)

更新2

我的启动类现在看起来像这样:

public class StartupConfig
{
    public static UserService<User> UserService { get; set; }
    public static string PublicClientId { get; private set; }
    public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; }

    static StartupConfig()
    {
        UserService = new UserService<User>(new UnitOfWork<DatabaseContext>(), false, true);
        PublicClientId = "self";

        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new OAuthProvider<User>(PublicClientId, UserService),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        };
    }

    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void Configuration(IAppBuilder app)
    {
        //var config = new HttpConfiguration();

        //// Set up our configuration
        //WebApiConfig.Register(config);

        // Enable the application to use a cookie to store information for the signed in user
        // and to use a cookie to temporarily store information about a user logging in with a third party login provider
        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

        // Enable the application to use bearer tokens to authenticate users
        app.UseOAuthBearerTokens(OAuthOptions);

        // Uncomment the following lines to enable logging in with third party login providers
        //app.UseMicrosoftAccountAuthentication(
        //    clientId: "",
        //    clientSecret: "");

        //app.UseTwitterAuthentication(
        //    consumerKey: "vnaJZLYwWFbv7GBlDeMbfwAlD",
        //    consumerSecret: "Q1FE1hEN6prXnK2O9TYihTFyOQmcQmrZJses0rT8Au4OsDQISQ");

        //app.UseFacebookAuthentication(
        //    appId: "",
        //    appSecret: "");

        //app.UseGoogleAuthentication();
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我取消注释WebApiConfig行,则永远不会执行启动类.知道为什么吗?

Nei*_*ord 7

您需要在启动类中调用app.UseWebApi,并传入要使用的配置.您还需要在那里调用WebApiConfig的Register方法.在减少的应用程序中,这可能是一个例子:

你可以有一个看起来像这样的OWIN启动类:

// Tell OWIN to start with this
[assembly: OwinStartup(typeof(MyWebApi.Startup))]
namespace MyWebApi
{
    public class Startup
    {
        /// <summary>
        /// This method gets called automatically by OWIN when the application starts, it will pass in the IAppBuilder instance.
        /// The WebApi is registered here and one of the built in shortcuts for using the WebApi is called to initialise it.
        /// </summary>
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            WebApiConfig.Register(config);
            app.UseWebApi(config);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

HttpConfiguration被创建并传递给WebApiConfig.Register方法.然后我们使用该app.UseWebApi(config)方法来设置web api.这是一个帮助方法System.Web.Http.Owin,你可以通过包含NuGet包来获得它Microsoft ASP.NET Web API 2.2 OWIN

WebApiConfig类看起来像这样:

namespace MyWebApi
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
}
Run Code Online (Sandbox Code Playgroud)