gpt4 book ai didi

c# - 谁能解释这个 'has no implementation' 错误?

转载 作者:行者123 更新时间:2023-11-30 17:32:46 25 4
gpt4 key购买 nike

长话短说,这直到最近才有效,无论我是在本地运行还是让构建服务器部署它运行,它都存在这个问题。经过多次代码调试后,我得出了这个结论:

(这是一个 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);在第二个例子中没有注释。

抛出的异常:

An exception occurred, System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.MissingMethodException: Method not found: 'System.Web.Http.Controllers.IHttpController System.Web.Http.Dispatcher.IHttpControllerActivator.Create(System.Net.Http.HttpRequestMessage, System.Web.Http.Controllers.HttpControllerDescriptor, System.Type)'.
at DAS.Services.Reviews.Command.Startup.Configuration(IAppBuilder app) --- End of inner exception stack trace --- at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
at Owin.Loader.DefaultLoader.<>c__DisplayClass12.b__b(IAppBuilder builder) at Owin.Loader.DefaultLoader.<>c__DisplayClass1.b__0(IAppBuilder builder) at Microsoft.Owin.Hosting.Engine.HostingEngine.ResolveApp(StartContext context) at Microsoft.Owin.Hosting.Engine.HostingEngine.Start(StartContext context) at Microsoft.Owin.Hosting.Starter.DirectHostingStarter.Start(StartOptions options) at Microsoft.Owin.Hosting.Starter.HostingStarter.Start(StartOptions options) at Microsoft.Owin.Hosting.WebApp.StartImplementation(IServiceProvider services, StartOptions options) at Microsoft.Owin.Hosting.WebApp.Start(StartOptions options) at Microsoft.Owin.Hosting.WebApp.Start[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:line 40 at Topshelf.Builders.ControlServiceBuilder`1.ControlServiceHandle.Start(HostControl hostControl) at 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());
}
}

更新2

所以我们只是将我们的核心库(nuget 包)移植到 netstandard2.0。在我们将这些新包拉入项目后,这个问题开始发生。我刚刚注意到,当我现在构建项目时,我在输出窗口中收到大量警告,建议我将一些 .Net 程序集的重新映射添加到 app.config。可能有大约 50 个不同的 .net 程序集。

这让我觉得 netstandard2.0 本身正在引用较新的框架库,并且在运行时发生了某种困惑。如果我将绑定(bind)重定向添加到 app.config,消息不会消失,所以我有点困惑。我不确定这是否相关。

如果我使用相同的包(我们的新 netstandard2.0 包)从头开始一个新项目,我将无法重现此问题。我在这里缺少什么?

最佳答案

所以我对此没有可靠的答案,但我最终让它工作的方法是将 net461 作为附加目标框架添加到 netstandard 库中。似乎如果将两者混合,就会发生一些奇怪的事情。我不知道实际发生了什么,但它几乎就像 .net 看到依赖图中有一个 netstandard 库,然后寻找一个实现,但对于整个过程,默认为 netcore。因此,如果某些内容未在 netcore 中实现,它将抛出未实现的异常。我假设通过添加 461 作为目标框架,“它”知道首先尝试将其作为实现。

关于c# - 谁能解释这个 'has no implementation' 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45945513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com