为什么我的Unity DependencyResolver在共享主机上不能工作,但在本地可以?

4
我正在尝试部署一个使用Unity作为IoC容器的ASP.NET MVC 3应用程序。该应用程序在本地服务器上运行良好,但在部署时会抛出异常:没有为此对象定义无参构造函数。这是由我的Unity DependencyResolver注入一些存储库的控制器引起的。
我已经通过NuGet安装了Unity,所以它应该被直接引用,并且我已经检查过它被复制到bin文件夹中。
编辑:
以下是堆栈跟踪:
[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache) +98
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +69
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +67

[InvalidOperationException: An error occurred when trying to create a controller of type 'nBlog.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +196
   System.Web.Mvc.<>c__DisplayClass6.<BeginProcessRequest>b__2() +49
   System.Web.Mvc.<>c__DisplayClassb`1.<ProcessInApplicationTrust>b__a() +13
   System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
   System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8841400
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +18

有人知道可能是什么问题吗?

编辑 2:

我通过在GAC中添加Mvc库的引用(System.Web.Mvc等)而不是直接引用来解决了这个问题。

以前,应用程序直接引用Mvc库,并将它们bin部署到托管服务器上,因为服务器安装了.net 4.0和mvc 2,但由于托管提供商安装了Mvc 3,所以我已经更改了对GAC的引用。我猜这是一些安全问题,但我对托管环境中的应用程序安全性还不太了解,我真的很想知道到底是什么问题?也希望提供资源链接。


看起来是web.config的配置问题。请同时展示堆栈跟踪。 - amit_g
1个回答

0
如果Unity在内部使用反射来构建类和依赖项,那么您的应用程序将隐式依赖于在完全信任下运行。
许多共享托管提供商仅允许最高达中等信任,因此可能会阻止Unity在运行时反射您的代码。您可以尝试请求以完全信任方式运行您的应用程序,但这取决于您的托管提供商。
一些类似的经验{{link1:请参见Rick Strahl的博客}}。
[编辑] 通过编辑您的web.config文件尝试在本地进行测试:
<location allowOverride="false">
  <system.web>
    <!-- level="[Full|High|Medium|Low|Minimal]" -->
    <trust level="Medium" originUrl=""/>
  </system.web>
</location>

你知道使用Entity Framework是否会出现同样的问题吗?(是的,我知道这与问题无关。 :-) ) - mwgriffith
@mwgriffith - 看看这个问题 https://dev59.com/nkfRa4cB1Zd3GeqP7kWu - Neil Fenwick
我按照你的建议尝试编辑了web.config文件,但在本地运行良好。我已经解决了这个问题(请参见我的编辑2),但我还不完全理解它。你能否解释一下或者给我一些有用的链接? - frennky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接