长话短说,这个过去一直工作到最近,它有这个问题,无论我是在本地运行还是让构建服务器部署它运行。通过代码更步进后,我已经能够拿出这样的:任何人都可以解释这'没有执行'的错误?
(这是一个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