首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >IDependencyResolver实现中的Web Api启动异常

IDependencyResolver实现中的Web Api启动异常
EN

Stack Overflow用户
提问于 2014-06-09 14:43:43
回答 7查看 24.9K关注 0票数 31

我正在开发一个Web,我决定使用自定义的DependencyResolver。我参考了this [Dependency Injection for Web API Controllers]的文章。到目前为止,在控制器的依赖注入方面,一切都运行得很好。Owin启动类中配置的代码片段

代码语言:javascript
复制
private void RegisterIoC(HttpConfiguration config)
{
    _unityContainer = new UnityContainer();
    _unityContainer.RegisterType<IAccountService, AccountService>();
    .........
    .........
    config.DependencyResolver = new UnityResolver(_unityContainer);
}

但是在时,当Api第一次启动时,会在UnityResolver's GetService方法中抛出(但捕获)一些ResolutionFailedException。以下是异常消息

代码语言:javascript
复制
"Exception occurred while: while resolving. 
Exception is: InvalidOperationException - 
The current type, System.Web.Http.Hosting.IHostBufferPolicySelector, 
**is an interface and cannot be constructed. Are you missing a type mapping?**"

在以下类型的之上引发了相同的异常

代码语言:javascript
复制
System.Web.Http.Hosting.IHostBufferPolicySelector
System.Web.Http.Tracing.ITraceWriter
System.Web.Http.Metadata.ModelMetadataProvider
System.Web.Http.Tracing.ITraceManager
System.Web.Http.Dispatcher.IHttpControllerSelector
System.Web.Http.Dispatcher.IAssembliesResolver
System.Web.Http.Dispatcher.IHttpControllerTypeResolver
System.Web.Http.Controllers.IHttpActionSelector
System.Web.Http.Controllers.IActionValueBinder
System.Web.Http.Validation.IBodyModelValidator
System.Net.Http.Formatting.IContentNegotiator

我知道这些ResolutionFailedException被抛出是因为我在unity配置中没有为上面的类型提供映射。

现在是我的问题:-,如果我实现自定义unity DependencyResolver,我需要定义上述类型的映射,如果需要定义它们相应的默认实现类型,或者是否有其他方法来实现DependencyResolver。我真的很担心,即使应用程序现在运行得很好,如果不能解决上面的类型,以后可能会导致严重的问题。请帮帮

最后一个补充:-以下类型的,当我在my web api中请求任何操作时抛出相同的ResolutionFailedException。

代码语言:javascript
复制
System.Web.Http.Dispatcher.IHttpControllerActivator
System.Web.Http.Validation.IModelValidatorCache
System.Web.Http.Controllers.IHttpActionInvoker
EN

回答 7

Stack Overflow用户

发布于 2015-02-17 20:26:56

我在WebApi和OWIN/Katana上使用Unity时也遇到了同样的问题。

对我来说,解决方案是使用Unity.WebApi Nuget包中定义的UnityDependencyResolver,而不是我自己的自定义实现(就像上面的@Omar Alani )

代码语言:javascript
复制
Install-Package Unity.WebAPI

请注意,该包将尝试在App_Start中添加一个名为UnityConfig.cs的文件(我自己使用的文件名)。

在UnityConfig.cs文件中,程序包将添加代码来根据GlobalConfiguration.Configuration.DependencyResolver注册容器,这不是我们使用OWIN所需要代码。

因此,不要使用:

代码语言:javascript
复制
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);

更改为使用:

代码语言:javascript
复制
config.DependencyResolver = new UnityDependencyResolver(container);

为了完整性:

我的UnityConfig.cs

代码语言:javascript
复制
public static class UnityConfig
{
    public static void Register(HttpConfiguration config)
    {
        var container = new UnityContainer();

        // Your mappings here

        config.DependencyResolver = new UnityDependencyResolver(container);
    }
}

我的Startup.cs

代码语言:javascript
复制
[assembly: OwinStartup(typeof(UnityTest.BusinessLayer.Api.ApiStartup))]
namespace UnityTest.BusinessLayer.Api
{
    public partial class ApiStartup
    {
        public void Configuration(IAppBuilder app)
        {

            app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

            HttpConfiguration httpConfig = new HttpConfiguration();

            UnityConfig.Register(httpConfig);

            ConfigureAuth(app); //In App_Start ->Startup.Auth

            WebApiConfig.Register(httpConfig);

            app.UseWebApi(httpConfig);
    }
  }
}
票数 31
EN

Stack Overflow用户

发布于 2016-07-28 12:49:50

如果上面的任何解决方案仍然不适用于人们,下面是我如何解决它的。

在花了一天的时间追踪这个错误后,它被证明是某种VS缓存问题。无奈之下,我删除了所有的.suo文件并强制获取最新版本,这似乎解决了这个问题。

票数 7
EN

Stack Overflow用户

发布于 2017-01-26 05:10:01

这个问题很久以前就有人问过了,但我遇到了一个这里没有提到的解决方案,所以也许有人仍然对此感兴趣。

在我的例子中,这些异常已经被Unity (或其他什么)在内部捕获了,但我在Visual Studio中的异常设置使它们仍然显示出来。我只需取消选中“当显示此异常类型时中断”复选框,应用程序就会继续正常运行。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24114970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档