【问题标题】:Why am I getting this ActivationException when using Simple Injector with WebApi Self Hosted in OWIN?为什么在 OWIN 中使用带有 WebApi 自托管的 Simple Injector 时会出现此 ActivationException?
【发布时间】:2014-12-26 11:39:08
【问题描述】:

我有一个非常简单的 Web Api v2.2 自托管在 OWIN 中

public class StartUp
{
    public void Configuration(IAppBuilder appBuilder, IConfigReader configReader)
    {
        var container = new Container();

        container.Register<IConfigReader, ConfigReader>();

        var config = new HttpConfiguration();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
        config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
        appBuilder.UseWebApi(config);
    }
}

当我在我的Main() 上使用时:

WebApp.Start(baseAddress, appBuilder => 
                new StartUp().Configuration(appBuilder, new ConfigReader()));

但是,当我尝试执行最后一行 appBuilder.UseWebApi(config); 时,出现以下异常:

“SimpleInjector.ActivationException”类型的第一次机会异常 发生在 SimpleInjector.dll 中

附加信息:给定类型 IHostBufferPolicySelector 是 不是具体类型。请使用其他重载之一进行注册 这种类型。

完整堆栈:

SimpleInjector.ActivationException 发生_HResult=-2146233088
_message=给定类型 IHostBufferPolicySelector 不是具体类型。请使用其他重载之一来注册此类型。
HResult=-2146233088 IsTransient=false Message=给定类型 IHostBufferPolicySelector 不是具体类型。请使用其中一种 注册此类型的其他重载。来源=SimpleInjector
堆栈跟踪: 在 SimpleInjector.Advanced.DefaultConstructorResolutionBehavior.VerifyTypeIsConcrete(类型 implementationType) InnerException:

问题不在于看起来像SimpleInjector 的单一接口试图为每个单一接口寻找绑定;如果我为IHostBufferPolicySelector 提供一个虚拟实现,它会抛出一些其他接口,例如IExceptionHandler

有一个相关的线程HERE,但我不确定它与SimpleInjector 有什么关系? Self 主机是一个控制台应用程序,其中安装了以下软件包:

  • 简单注入器 ASP.NET Web API 集成 v2.61
  • 简单的注入器执行上下文范围 v2.61
  • Simple Injector v2.61
  • OWIN v1.0
  • Microsoft.Owin v2.0.2
  • Microsoft.Owin.Hosting v2.0.2
  • Microsoft ASP.NET Web API 2.2 OWIN v5.2.2
  • Microsoft ASP.NET Web API 2.2 OWIN Self Host v5.2.2

【问题讨论】:

  • IHostBufferPolicySelector的注册地址在哪里?
  • 什么是IHostBufferPoslicySelector,什么是可用的(默认)实现?
  • 请发布完整的堆栈跟踪。
  • @MaYaN:这不是完整的堆栈跟踪。请同时包括所有内部异常。尤其是这里的一切。所以我们需要查看从请求开始到此时的完整堆栈跟踪。
  • @Steven,这确实是完整的堆栈,我现在已经更新了问题以包括所有其他位,但仅此而已。

标签: asp.net-web-api owin asp.net-web-api2 self-hosting simple-injector


【解决方案1】:

根据Simple Injector:

您显示的例外是“第一次机会例外”。这些 异常由 Simple Injector 抛出,但它们被捕获并 由 Simple Injector 处理,它们不会在调用堆栈中冒泡。 您可能会在某些调试器输出窗口中看到它们,但是 它们很正常,无需担心。

【讨论】:

    【解决方案2】:

    事实证明,只有当我将 Common Language Runtime Exceptions 检查为 thrown 时,异常才会冒泡

    当我取消勾选复选框时,一切正常!这很奇怪!也将它包裹在 Try-Catch (Exception) 中甚至没有捕捉到它,这使它更加有趣/古怪!

    【讨论】:

    • 太好了,您发现了如何获得完整的堆栈跟踪。你能用这些信息更新你的问题吗?
    • Here's an example 了解完整堆栈跟踪的外观。
    • 史蒂文,我在问题中发布的是all 我得到了,即使我将它包装在Try-Catch 中也永远不会遇到断点,所以不能在ToString() 上做它。我上面发布的内容是我直接从 VisualStudio 中的Thrown dialog box 复制的。它甚至没有在Global App Domain Exception Handler 中被捕获
    • 很抱歉,如果没有关于触发此异常的代码的更多信息,任何人都无法为您提供帮助。
    • @Steven - 遇到这个有点太晚了,我认为如果我们在 Visual Studio 中运行诊断工具并通过从此异常事件中选择历史调试来捕获调用堆栈,堆栈跟踪将变得可用。
    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多