長話短說,這個過去一直工作到最近,它有這個問題,無論我是在本地運行還是讓構建服務器部署它運行。通過代碼更步進後,我已經能夠拿出這樣的:任何人都可以解釋這'沒有執行'的錯誤?
(這是一個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包)從頭開始一個新項目,我不能重新創建此問題。我在這裏錯過了什麼?
請注意,容器初始化的位置是它當前的位置,因爲我一直在移動它以查看它是否會產生任何效果,但不會。 – Sinaesthetic
是否有任何具體的原因你正在做一個私人接口實現?你可以嘗試使控制器創建函數公開,並從函數名稱中刪除'IHttpControllerActivator',所以'IHttpControllerActivator.Create'變成'Create'? – juunas
@juunas對此抱歉,我沒有意識到我把它留在這裏。這只是我嘗試一切的一個神器。切換它沒有影響:/ – Sinaesthetic