Почему мой Unity DependencyResolver не работает на виртуальном хостинге, а работает локально? - PullRequest
4 голосов
/ 11 марта 2011

Я пытаюсь развернуть приложение ASP.NET MVC 3, которое использует Unity в качестве контейнера IoC. Приложение отлично работает на локальном сервере, но при развертывании выдает исключение: для этого объекта не определен конструктор без параметров. И это выброшено для контроллера, которому должен быть вставлен некоторый репозиторий моим Unity DependencyResolver.

Я установил Unity с NuGet, поэтому на него следует ссылаться напрямую, и я проверил, что он копируется в папку bin.

Edit:

Вот трассировка стека:

[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:

Я решил проблему, добавив ссылки на библиотеки Mvc (System.Web.Mvc и т. Д.) В GAC вместо прямых ссылок.

Ранее приложение обращалось непосредственно к библиотекам Mvc, и они были развернуты в bin на хост-сервере, потому что на сервере были установлены .net 4.0 и mvc 2, но, поскольку хостинг-провайдер установил Mvc 3, я перешел на ссылки на GAC. Я предполагаю, что это была некоторая проблема безопасности, но я новичок в этой безопасности приложений в размещенных средах, и я действительно хотел бы знать, в чем именно была проблема? Ссылки на ресурсы также приветствуются.

1 Ответ

0 голосов
/ 12 марта 2011

Если Unity использует Reflection внутренне для конструирования классов и зависимостей, то у вас будет неявная зависимость от запуска вашего приложения в Полное доверие .

Многие провайдеры виртуального хостинга допускают только Среднее доверие , поэтому может случиться так, что Unity не сможет отразить ваш код во время выполнения. Вы можете запросить, чтобы ваше приложение было запущено в режиме полного доверия, но это зависит от вашего хостинг-провайдера.

Некоторые похожие впечатления из блога Рика Строля здесь

[EDIT] Попробуйте выполнить локальное тестирование, отредактировав файл web.config:

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