2015-08-16 4 views
3

Недавно мы обновились до Sitecore 8.0 от Sitecore 7.5. После обновления, вызовы пользовательского Web API начали возвращаться 500 кодов ошибок с ниже исключением:Вызов WEB API, дающий 500 ошибок после обновления до sitecore 8

Message:"An error has occurred." 
ExceptionMessage:"ValueFactory attempted to access the Value property of this instance." 
ExceptionType:"System.InvalidOperationException" 
StackTrace:" at System.Lazy`1.CreateValue() 
    at System.Lazy`1.LazyInitValue() 
    at System.Web.Http.Dispatcher.DefaultHttpControllerSelector.GetControllerMapping() 
    at System.Web.Http.Routing.AttributeRoutingMapper.AddRouteEntries(SubRouteCollection collector, HttpConfiguration configuration, IInlineConstraintResolver constraintResolver, IDirectRouteProvider directRouteProvider) 
    at System.Web.Http.Routing.AttributeRoutingMapper.<>c__DisplayClass2.<>c__DisplayClass4.<MapAttributeRoutes>b__1() 
    at System.Web.Http.Routing.RouteCollectionRoute.EnsureInitialized(Func`1 initializer) 
    at System.Web.Http.Routing.AttributeRoutingMapper.<>c__DisplayClass2.<MapAttributeRoutes>b__0(HttpConfiguration config) 
    at System.Web.Http.CorsHttpConfigurationExtensions.<>c__DisplayClass3.<AddCorsMessageHandler>b__0(HttpConfiguration config) 
    at System.Web.Http.HttpConfiguration.ApplyControllerSettings(HttpControllerSettings settings, HttpConfiguration configuration) 
    at System.Web.Http.Controllers.HttpControllerDescriptor.InvokeAttributesOnControllerType(HttpControllerDescriptor controllerDescriptor, Type type) 
    at System.Web.Http.Dispatcher.DefaultHttpControllerSelector.InitializeControllerInfoCache() 
    at System.Lazy`1.CreateValue() 
    at System.Lazy`1.LazyInitValue() 
    at System.Web.Http.Dispatcher.DefaultHttpControllerSelector.GetControllerMapping() 
    at System.Web.Http.Routing.AttributeRoutingMapper.AddRouteEntries(SubRouteCollection collector, HttpConfiguration configuration, IInlineConstraintResolver constraintResolver, IDirectRouteProvider directRouteProvider) 
    at System.Web.Http.Routing.AttributeRoutingMapper.<>c__DisplayClass2.<>c__DisplayClass4.<MapAttributeRoutes>b__1() 
    at System.Web.Http.Routing.RouteCollectionRoute.EnsureInitialized(Func`1 initializer) 
    at System.Web.Http.Routing.AttributeRoutingMapper.<>c__DisplayClass2.<MapAttributeRoutes>b__0(HttpConfiguration config) 
    at System.Web.Http.CorsHttpConfigurationExtensions.<>c__DisplayClass3.<AddCorsMessageHandler>b__0(HttpConfiguration config) 
    at System.Web.Http.HttpConfiguration.ApplyControllerSettings(HttpControllerSettings settings, HttpConfiguration configuration) 
    at System.Web.Http.Controllers.HttpControllerDescriptor.InvokeAttributesOnControllerType(HttpControllerDescriptor controllerDescriptor, Type type) 
    at Sitecore.Services.Infrastructure.Web.Http.Dispatcher.NamespaceHttpControllerSelector.InitializeControllerDictionary() 
    at System.Lazy`1.CreateValue() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Lazy`1.get_Value() 
    at Sitecore.Services.Infrastructure.Web.Http.Dispatcher.NamespaceHttpControllerSelector.SelectController(HttpRequestMessage request) 
    at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()" 

Маршруты зарегистрированы в global.asax.cs:

protected void Application_Start(object sender, EventArgs e) 
     { 
      GlobalConfiguration.Configure(config => 
      { 
       config.MapHttpAttributeRoutes(); 

       //config.Routes.MapHttpRoute(
       // name: "DefaultApi", 
       // routeTemplate: "api/{controller}/{id}", 
       // defaults: new { id = RouteParameter.Optional } 
       //); 
      }); 
      SqlServerTypes.Utilities.LoadNativeAssemblies(Server.MapPath("~/bin")); 
     } 

ответ

3

This solution работал для нас при попытке обновления. Вы должны полностью прочитать сообщение, чтобы понять, что он делает, а вкратце вам нужно будет создать пользовательский HttpControllerSelector и поменять его на Sitecore после того, как Sitecore добавит все маршруты. Примечание. Ничего из этого резюме изначально мое. Я почерпнул все это из связанной статьи.

Как раз в качестве примечания, я настоятельно рекомендую избежать обновления на месте Sitecore 8. Я бы сказал, что почти всегда лучше использовать новую установку Sitecore 8, а затем переносить содержимое через пакет. This blog - отличный взгляд на два варианта.

+0

Было бы лучше предоставить краткое изложение решения в ответе, см. [Ответы, содержащие только ссылки в других местах «хорошие ответы»?] (Http://meta.stackexchange.com/questions/8231/ are-answers-that-just-содержать-ссылки-в другом месте-действительно-хорошие ответы) – Liam

+0

Я предоставил контекст для обеих ссылок. Кроме того, я не собираюсь плагиатом или воровать чужую работу. Мы использовали эту точную статью, чтобы исправить нашу проблему, и я не буду копировать ее здесь. – Casey

+2

Это сработало для меня, но мне нужно было добавить следующее: 'public override IDictionary GetControllerMapping() { return _controllers; } '' 'CustomHttpControllerSelector' –