长话短说,直到最近才开始工作,无论我是在本地运行还是让构建服务器将其部署为运行,它都有这个问题。经过大量的代码处理后,我能够想出这个:
(这是一个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;
}
}
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: 调用的目标抛出了异常。 ---&GT; System.MissingMethodException:找不到方法: “System.Web.Http.Controllers.IHttpController System.Web.Http.Dispatcher.IHttpControllerActivator.Create (System.Net.Http.HttpRequestMessage, System.Web.Http.Controllers.HttpControllerDescriptor,System.Type)'。
在DAS.Services.Reviews.Command.Startup.Configuration(IAppBuilder应用程序) ---内部异常堆栈跟踪的结束---在System.RuntimeMethodHandle.InvokeMethod(Object target,Object [] 参数,签名sig,布尔构造函数)at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object []参数,Object []参数)at System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)
在 Owin.Loader.DefaultLoader&LT;&GT; c__DisplayClass12.b__b(IAppBuilder 建设者) Owin.Loader.DefaultLoader&LT;&GT; c__DisplayClass1.b__0(IAppBuilder 建设者) Microsoft.Owin.Hosting.Engine.HostingEngine.ResolveApp(StartContext 上下文) Microsoft.Owin.Hosting.Engine.HostingEngine.Start(StartContext 上下文) Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions 选项)at Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions 选项)at Microsoft.Owin.Hosting.WebApp.StartImplementation(的IServiceProvider 服务,StartOptions选项)at Microsoft.Owin.Hosting.WebApp.Start(StartOptions选项)at Microsoft.Owin.Hosting.WebApp.Start [TStartup](StartOptions选项)
在DAS.Services.Reviews.Command.HostingConfiguration.Start(HostControl hostControl)in C:\源\ DAS \平台\ das.services.reviews \ SRC \ DAS.Services.Reviews.Command \ Host.cs:线 40点 Topshelf.Builders.ControlServiceBuilder`1.ControlServiceHandle.Start(HostControl hostControl)在Topshelf.Hosts.ConsoleRunHost.Run()
最令人沮丧的是,只要取消注释该实例化,就会在调用WebApp.Start<Startup>(options)
后立即导致整个启动失败。如果取消注释该行,则不会触发Startup.cs中的断点。如果我注释掉那条线,那么断点将被击中,每一个开始都没问题。
我很难过。我试过清理解决方案并重新启动等等,没有运气。如果它是通过构建服务器构建和部署的,则会出现同样的问题。
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());
}
}
因此我们将核心库(nuget包)移植到netstandard2.0。在我们将这些新包提取到项目中之后,这个问题就开始发生了。我刚刚注意到,当我现在构建项目时,我在输出窗口中收到一些警告,建议我将一些.Net程序集的重新映射添加到app.config中。可能大约有50种不同的.net程序集。
这让我觉得netstandard2.0本身正在引用更新的框架库,并且在运行时会发生某种纠结。如果我将绑定重定向添加到app.config,消息不会消失,所以我有点困惑。我不确定这是否相关。
如果我从头开始使用相同的软件包(我们新的netstandard2.0软件包)开始一个新项目,我就无法重新创建这个问题。我在这里缺少什么?
答案 0 :(得分:1)
所以我对此没有一个可靠的答案,但我最终让它工作的方式是在netstandard库中添加net461作为额外的目标框架。看起来如果你混合两者,就会发生一些奇怪的事情。我不知道实际发生了什么,但它几乎就像.net看到依赖图中有一个netstandard库,然后寻找一个实现,但对于整个进程,默认为netcore。因此,如果在netcore中没有实现某些功能,它将抛出未实现的异常。我假设通过添加461作为目标框架,&#34;它&#34;我知道要首先尝试这样做。