【问题标题】:Why doesn't my Unity DependencyResolver work on shared hosting but works locally?为什么我的 Unity DependencyResolver 不能在共享主机上工作,但在本地工作?
【发布时间】:2011-03-14 00:15:53
【问题描述】:

我正在尝试部署使用 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 中的配置问题。还向我们展示堆栈跟踪。

标签: asp.net-mvc unity-container


【解决方案1】:

如果 Unity 在内部使用反射来构造类和依赖项,那么您将对在 完全信任 中运行的应用程序产生隐式依赖。

许多共享托管服务提供商最多只允许中等信任度,因此可能会阻止 Unity 在运行时反映您的代码。您或许可以请求以完全信任的方式运行您的应用程序,但这取决于您的托管服务提供商。

一些类似的经历from Rick Strahl's blog here

[编辑] 通过编辑您的 web.config 文件尝试在本地进行测试:

<location allowOverride="false">
  <system.web>
    <!-- level="[Full|High|Medium|Low|Minimal]" -->
    <trust level="Medium" originUrl=""/>
  </system.web>
</location>

【讨论】:

  • 你知道实体框架是否会出现同样的问题吗? (是的,我知道这与问题无关。:-))
  • @mwgriffith - 看看这个问题stackoverflow.com/questions/766540/…
  • 我尝试按照您的建议编辑 web.config,但它在本地运行良好。我已经解决了这个问题(请参阅我的编辑 2),但我并不完全理解它。您能否解释一下或指出一些有用的链接?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-27
  • 2017-12-12
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多