MVCsiteMapProvider дает нулевую ссылку при перемещении в производство

Я пишу приложение MVC 4.5, используя MVCsiteMapProvider 4.4.9.0. При разработке в Visual Studio под управлением Visual Studio Development Server все работает как положено. Однако после публикации проекта на рабочем сервере я столкнулся с NullReferenceException. Вот стек вызовов. (Извините, недостаточно очков репутации для размещения скриншота)

Server Error in '/' Application.
--------------------------------------------------------------------------------

Object reference not set to an instance of an object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[NullReferenceException: Object reference not set to an instance of an object.]
   MvcSiteMapProvider.Reflection.MvcSiteMapNodeAttributeDefinitionProvider.GetAttributeDefinitionsForControllers(Type type) +71
   MvcSiteMapProvider.Reflection.MvcSiteMapNodeAttributeDefinitionProvider.GetMvcSiteMapNodeAttributeDefinitions(IEnumerable`1 assemblies) +168
   MvcSiteMapProvider.DI.SiteMapNodeFactoryContainer.GetMvcSiteMapNodeAttributeDynamicNodeProviderNames() +105
   MvcSiteMapProvider.DI.SiteMapNodeFactoryContainer.ResolveDynamicNodeProviders() +148
   MvcSiteMapProvider.DI.SiteMapNodeFactoryContainer..ctor(ConfigurationSettings settings, IMvcContextFactory mvcContextFactory, IUrlPath urlPath) +306
   MvcSiteMapProvider.DI.SiteMapLoaderContainer..ctor(ConfigurationSettings settings) +409
   MvcSiteMapProvider.DI.Composer.Compose() +430

[TargetInvocationException: Exception has been thrown by the target of an invocation.]
   System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor) +0
   System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments) +229
   System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +193
   System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters) +35
   WebActivatorEx.BaseActivationMethodAttribute.InvokeMethod() +341
   WebActivatorEx.ActivationManager.RunActivationMethods(Boolean designerMode) +854
   WebActivatorEx.ActivationManager.RunPostStartMethods() +40
   WebActivatorEx.StartMethodCallingModule.Init(HttpApplication context) +159
   System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +530
   System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +304
   System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +404
   System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +475

[HttpException (0x80004005): Exception has been thrown by the target of an invocation.]
   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12881540
   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159
   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12722601



--------------------------------------------------------------------------------
Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.17929 

Я выполнил поиск по этой ошибке, и те, которые я нашел, показали совершенно другую трассировку стека вызовов.

Вот MVC.SiteMap

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0"
            xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">

  <mvcSiteMapNode title="Projects" controller="Project" action="Index">
      <mvcSiteMapNode title="Supplier/Trade" controller="SupplierTrade" action="Index"  preservedRouteParameters="pid">
          <mvcSiteMapNode title="Approval Actions" controller="SupplierTrade" action="ApprovalActions"  preservedRouteParameters="pid, stmid">
              <mvcSiteMapNode title="Edit PMs" controller="User" action="Index"  preservedRouteParameters="pid, stmid"/>
              <mvcSiteMapNode title="Contractor Standard Invoice Percent" controller="ContractorStandardInvoicePercent" action="Index"  preservedRouteParameters="pid, stmid"/>
              <mvcSiteMapNode title="Approval Status Of CostCode" controller="ApprovalStatusOfCostCode" action="Index"  preservedRouteParameters="pid, stmid"/>
          </mvcSiteMapNode>
      </mvcSiteMapNode>
  </mvcSiteMapNode>
</mvcSiteMap>

Я продолжаю думать, что мне не хватает какого-то параметра конфигурации или файла, который находится на моей машине разработки, но не на рабочей машине, поскольку версия 3.3.6 работает безупречно. Любые идеи?


person Steve    schedule 05.02.2014    source источник
comment
Я получаю ту же ошибку, вы когда-нибудь находили причину этого?   -  person Rob Bird    schedule 21.10.2014


Ответы (1)


Ошибка указывает на то, что что-то не так, когда MvcSiteMapProvider сканирует ваш проект на наличие узлов [MvcSiteMapNodeAttribute]. Некоторые вещи, которые вы могли бы попробовать:

  1. Если вы не используете [MvcSiteMapNodeAttribute] в своем приложении, вы можете отключить это сканирование, установив для «MvcSiteMapProvider_ScanAssembliesForSiteMapNodes» значение «false» в файле web.config.
  2. Если вы используете [MvcSiteMapNodeAttribute], убедитесь, что вы добавили все сборки, где они определены в «MvcSiteMapProvider_IncludeAssembliesForScan», разделенные запятыми. Убедитесь, что каждое имя соответствует тому, что определено в поле «Имя сборки» в свойствах проекта на вкладке «Приложение». Это (или поле «MvcSiteMapProvider_ExcludeAssembliesForScan») является обязательным, если «MvcSiteMapProvider_ScanAssembliesForSiteMapNodes» имеет значение «true».
  3. Если вы используете «MvcSiteMapProvider_ExcludeAssembliesForScan», попробуйте переключиться на использование «MvcSiteMapProvider_IncludeAssembliesForScan», чтобы MvcSiteMapProvider не собирал некоторые сборки, которые не должен.

Ссылка: Настройка MvcSiteMapProvider

person NightOwl888    schedule 06.02.2014
comment
У меня сработало отключение MvcSiteMapProvider_ScanAssembliesForSiteMapNodes, однако это странно, потому что это работает в других средах. Это было проблемой для нас при развертывании только на конкретной виртуальной машине Azure. - person Rob Bird; 23.10.2014
comment
Похоже, это может быть вызвано проблемой разрешения безопасности .NET Reflection в Azure. - person NightOwl888; 03.11.2014
comment
Спасибо за ответ NightOwl - в конце концов оказалось, что .net framework не был должным образом зарегистрирован в IIS на коробке. - person Rob Bird; 06.11.2014