2017-08-29 112 views
2

長話短說,這個過去一直工作到最近,它有這個問題,無論我是在本地運行還是讓構建服務器部署它運行。通過代碼更步進後,我已經能夠拿出這樣的:任何人都可以解釋這'沒有執行'的錯誤?

(這是一個owin自託管ASP應用程序,這是WebApp.Start<Startup>(options)稱爲類它打破了這裏的每一個時間:

這工作正常,並在應用程序啓動

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 

     var config = new HttpConfiguration(); 

     // controller injector 
     //var controllerActivator = new CustomControllerActivator(HostContainer.Current); 
     //config.Services.Replace(typeof(IHttpControllerActivator), controllerActivator); 

     config.Routes.MapHttpRoute("DefaultApi", 
      "{controller}/{id}", 
      new { id = RouteParameter.Optional }); 

     HostContainer.Initialize(); 
     app.UseWebApi(config); 
    } 
} 

public class CustomControllerActivator : IHttpControllerActivator 
{ 
    private readonly IWindsorContainer _container; 

    public CustomControllerActivator(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
    { 
     var controller = _container.Resolve(controllerType) as IHttpController; 
     request.RegisterForDispose(new DisposeAction(() => _container.Release(controller))); 
     return controller; 
    } 
} 

這會盡快拋出一個異常作爲CustomControllerActivator被實例化

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 

     var config = new HttpConfiguration(); 

     // controller injector 
     var controllerActivator = new CustomControllerActivator(HostContainer.Current); 
     //config.Services.Replace(typeof(IHttpControllerActivator), controllerActivator); 

     config.Routes.MapHttpRoute("DefaultApi", 
      "{controller}/{id}", 
      new { id = RouteParameter.Optional }); 

     HostContainer.Initialize(); 
     app.UseWebApi(config); 
    } 
} 

public class CustomControllerActivator : IHttpControllerActivator 
{ 
    private readonly IWindsorContainer _container; 

    public CustomControllerActivator(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType) 
    { 
     var controller = _container.Resolve(controllerType) as IHttpController; 
     request.RegisterForDispose(new DisposeAction(() => _container.Release(controller))); 
     return controller; 
    } 
} 

這兩個示例之間的唯一區別是var controllerActivator = new CustomControllerActivator(HostContainer.Current);在第二個示例中未被註釋。

時引發的異常:

發生異常,System.Reflection.TargetInvocationException: 異常已被調用的目標拋出。 ---> system.missingMethodException而:找不到方法: 「System.Web.Http.Controllers.IHttpController System.Web.Http.Dispatcher.IHttpControllerActivator.Create(System.Net.Http.HttpRequestMessage, 系統。 Web.Http.Controllers.HttpControllerDescriptor,System.Type)'。
在DAS.Services.Reviews.Command.Startup.Configuration(IAppBuilder應用) ---內部異常堆棧跟蹤的末尾在System.RuntimeMethodHandle.InvokeMethod(對象目標,對象[] 參數,簽名Sig,在 System.Reflection.RuntimeMethodInfo.Invoke(對象OBJ布爾構造函數)在 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(對象OBJ, 對象[]參數,對象[]參數),的BindingFlags invokeAttr,粘結劑粘結劑,對象[]參數,CultureInfo文化)
at Owin.Loader.DefaultLoader。 <> c__DisplayClass12.b__b(IAppBuilder builder)at Owin.Loader.DefaultLoader。 <> c__DisplayClass1.b__0(IAppBuilder 製造商)處 微軟 Microsoft.Owin.Hosting.Engine.HostingEngine.ResolveApp(StartContext 上下文)在 Microsoft.Owin.Hosting.Engine.HostingEngine.Start(StartContext 上下文)。 Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions 選項)在 Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions 選項)在 Microsoft.Owin.Hosting.WebApp.StartImplementation(IServiceProvider的 服務,StartOptions選項)at Microsoft.Owin.Hosting.WebApp.Start(StartOptions options)at Microsoft.Owin.Hosting.WebApp.Sta rt [TStartup](StartOptions options)
at DAS.Services.Reviews.Command.HostingConfiguration.Start(HostControl hostControl)in C:\ source \ das \ Platform \ das.services.reviews \ src \ DAS.Services。 Reviews.Command \ Host.cs:行 40 at Topshelf.Builders.ControlServiceBuilder`1.ControlServiceHandle.Start(HostControl hostControl)位於Topshelf.Hosts.ConsoleRunHost。運行()

最令人沮喪的部分是,簡單地取消註釋該實例會導致整個啓動失敗,只要WebApp.Start<Startup>(options)被調用。如果該行未註釋,則Startup.cs中不會有中斷點。如果我註釋掉那條線,那麼破發點就會被擊中,每一步都會開始。

我很難過。我試過清理解決方案並重新啓動等,但沒有運氣。如果通過構建服務器構建和部署,則會出現同樣的問題。

更新:這是主機容器。不起眼IMO:

public class HostContainer 
{ 
    public static IWindsorContainer Current { get; private set; } 

    public static void Initialize() 
    { 
     // this allows multiple registrations of a service (multis will return an array). This 
     // must be run before registrations (i.e. before Install() is called) 
     Current = new WindsorContainer(); 
     Current.Kernel.Resolver.AddSubResolver(new CollectionResolver(Current.Kernel, true)); 
     Current.Install(FromAssembly.This()); 
    } 
} 

更新2

所以我們只是移植了我們的核心庫(的NuGet包)至netstandard2.0。在我們將這些新軟件包拉入項目之後,這個問題就開始發生了。我剛剛注意到,當我現在構建項目時,我在輸出窗口中看到許多警告,建議我將一些.Net程序集的重新映射添加到app.config。可能大約有50個不同的.net程序集。

這讓我感覺像netstandard2.0本身引用了更新的框架庫,並且在運行時發生了某種糾結現象。如果我將綁定重定向添加到app.config,則郵件不會消失,所以我有點困惑。我不確定這是否相關。

如果我從頭開始使用相同的包(我們的新netstandard2.0包)從頭開始一個新項目,我不能重新創建此問題。我在這裏錯過了什麼?

+0

請注意,容器初始化的位置是它當前的位置,因爲我一直在移動它以查看它是否會產生任何效果,但不會。 – Sinaesthetic

+1

是否有任何具體的原因你正在做一個私人接口實現?你可以嘗試使控制器創建函數公開,並從函數名稱中刪除'IHttpControllerActivator',所以'IHttpControllerActivator.Create'變成'Create'? – juunas

+1

@juunas對此抱歉,我沒有意識到我把它留在這裏。這只是我嘗試一切的一個神器。切換它沒有影響:/ – Sinaesthetic

回答

1

所以我沒有一個可靠的答案,但我最終得到它的方式是將net461作爲額外的targetframework添加到netstandard庫中。看起來,如果你將這兩者混合在一起,會發生一些奇怪的事情。我不知道實際發生了什麼,但幾乎就像.net看到依賴圖中有一個netstandard庫,然後查找實現,但是對於整個過程,默認爲netcore。所以如果在netcore中沒有實現,它會拋出未實現的異常。我假設通過添加461作爲目標框架,「它」知道作爲一個實現首先嚐試。

相關問題