任何人都可以解释这个“没有实现”错误吗?

时间:2017-08-29 17:55:31

标签: c# .net asp.net-web-api

长话短说,直到最近才开始工作,无论我是在本地运行还是让构建服务器将其部署为运行,它都有这个问题。经过大量的代码处理后,我能够想出这个:

(这是一个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:   调用的目标抛出了异常。 ---&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中的断点。如果我注释掉那条线,那么断点将被击中,每一个开始都没问题。

我很难过。我试过清理解决方案并重新启动等等,没有运气。如果它是通过构建服务器构建和部署的,则会出现同样的问题。

更新:这是主机容器。不起眼的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软件包)开始一个新项目,我就无法重新创建这个问题。我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

所以我对此没有一个可靠的答案,但我最终让它工作的方式是在netstandard库中添加net461作为额外的目标框架。看起来如果你混合两者,就会发生一些奇怪的事情。我不知道实际发生了什么,但它几乎就像.net看到依赖图中有一个netstandard库,然后寻找一个实现,但对于整个进程,默认为netcore。因此,如果在netcore中没有实现某些功能,它将抛出未实现的异常。我假设通过添加461作为目标框架,&#34;它&#34;我知道要首先尝试这样做。