2017-08-29 110 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作为目标框架,“它”知道作为一个实现首先尝试。

相关问题