2014-11-05 77 views
0

我有一個自託管的asp.net web api。我有幾個API工作正常。所有要求都達到API方法並且響應客戶。 現在我嘗試爲web-api添加授權。CreatePerOwinContext在owin自我託管的web-api中導致404響應

我通過添加AUTH SECTION來更改我的啓動配置。

static void Main(string[] args) 
     { 
      StartOptions startOptions = new StartOptions(); 
      startOptions.Urls.Add("https://*:44305/"); 
      startOptions.Urls.Add("http://*:9001/"); 
      using (Microsoft.Owin.Hosting.WebApp.Start<dobStartUp>(startOptions)) 
      { 
       //... 
      } 
     } 
    public class dobStartUp 
    { 
     public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 

     public static string PublicClientId { get; private set; } 

     public void Configuration(IAppBuilder app) 
     { 
      //----AUTH SECTION--- 
      app.CreatePerOwinContext(ApplicationDbContext.Create); 
      app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
      // PublicClientId = "self"; 
      // OAuthOptions = new OAuthAuthorizationServerOptions 
      // { 
      //  TokenEndpointPath = new PathString("/Token"), 
      //  Provider = new ApplicationOAuthProvider(PublicClientId), 
      //  AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
      //  AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      //  AllowInsecureHttp = true 
      // }; 
      // app.UseOAuthBearerTokens(OAuthOptions); 
      //------------- 

      var config = new HttpConfiguration(); 
      config.SuppressDefaultHostAuthentication(); 
      config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 
      config.Services.Replace(typeof(IAssembliesResolver),new dobAssembliesResolver()); 
      config.Formatters.Clear(); 
      config.Formatters.Add(new JsonMediaTypeFormatter()); 
      config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings(); 
      // config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new Common.dobJsonContractResolver(); 
      var container = new UnityContainer(); 
      container.RegisterType<IdobRDBRepository, dobRDBRepository>(new TransientLifetimeManager()); 
      container.RegisterType<IResourcesContentRepository, AS3ContentRepository>(new TransientLifetimeManager()); 
      SystemDiagnosticsTraceWriter traceWriter = config.EnableSystemDiagnosticsTracing(); 
      traceWriter.IsVerbose = false; 
      traceWriter.MinimumLevel = TraceLevel.Debug; 
      config.DependencyResolver = new UnityDependencyResolver(container); 
      config.MapHttpAttributeRoutes(); 
      app.UseWebApi(config); 
     } 
    } 

當我在AUTH-部分使用app.CreatePerOwinContext,方法可以創建appDbContext和appUserManager被調用,但我對每個API方法404個responces。當我不這樣調用這些CreatePerOwinContext方法時,每個工作都照常進行。我知道我可以使用IoC容器來創建dbContext和userManager的實例,但是我想了解我的app.CreatePerOwinContext和404響應的當前問題。 預先感謝大家。

回答

0

我發現404響應的原因。這是因爲自定義程序集解析器。我有控制器在單獨的DLL,這就是爲什麼我使用自定義程序集解析器,我手動加載與API控制器的程序集。這工作得很好,直到我在owin管道中只使用web-api。 接下來我嘗試向web api添加授權 - 我使用了[CreatePerOwinContext]和[app.UseOAuthBearerTokens],因此我添加了中間件。它在web-api開始創建任何控制器之前加載引用的程序集。如果我在調試時理解正確,我已經加載了兩次api-controllers程序集。所以它在創建控制器實例的時候造成了衝突。

+0

我不確定你的解決方案是什麼。你可以粘貼你的新代碼嗎?謝謝! – Matt 2015-01-25 02:00:16