Инструментарий MVC и маршрутизация атрибутов WebApi для Sitecore 7.5

Я пытался заставить WebApi работать с Sitecore 7.5 (мне удалось заставить тот же код работать с 7.2). Я оставил в конфигурации ссылку на MVC 5.1 и я получаю следующее исключение, когда пытаюсь получить доступ к маршруту, сопоставленному с атрибутом:

[RoutePrefix("test/api/Other")]
[Route("{action=Get}")]
public class OtherController : ApiController
{
    [HttpGet]
    public string GetId()
    {
        return "test";
    }
}

Сообщение: «Произошла ошибка.», ExceptionMessage: «Значение не может быть нулевым. Имя параметра: ключ», ExceptionType: «System.ArgumentNullException», StackTrace: «в System.Collections.Generic.Dictionary2.FindEntry(TKey key) at System.Collections.Generic.Dictionary2.TryGetValue (ключ TKey, TValue& значение) в Sitecore.Services.Infrastructure.Web.Http.Dispatcher.NamespaceHttpControllerSelector.SelectController(запрос HttpRequestMessage) в System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(запрос HttpRequestMessage, CancellationToken CancellationToken) в System.Web.Http.Dispatcher. HttpControllerDispatcher.d__0.MoveNext()"

Код, который у меня есть в запуске приложения, следующий:

protected void Application_Start(object sender, EventArgs e)
{
    GlobalConfiguration.Configure(ConfigureRoutes);
}

public static void ConfigureRoutes(HttpConfiguration config)
{
    GlobalConfiguration.Configuration.MapHttpAttributeRoutes();
    GlobalConfiguration.Configuration.Formatters.Clear();
    GlobalConfiguration.Configuration.Formatters.Add(new JsonMediaTypeFormatter());
}

любая помощь будет оценена....


person Stelio    schedule 26.11.2014    source источник
comment
Добавили ли вы префикс маршрута (в данном случае test/api) в настройку IgnoreUrlPrefixes в Sitecore?   -  person PizzaTheHut    schedule 27.11.2014
comment
да, я только что попробовал добавить префикс маршрута в IngnoreUrlPrefix, и он все еще не работает ... самое смешное, что этот же код работает в чистом экземпляре 7.2, я думаю, что новый DI Sitecore.Services .Infrastructure.Web.Http.Dispatcher.NamespaceHttpControllerSelector.SelectController получает ошибку ссылки на объект   -  person Stelio    schedule 27.11.2014
comment
Я думаю, что проблема заключается в маршрутизации атрибутов, где находится ссылка на объект и получение, единственный способ заставить его работать - это не использовать маршрутизацию атрибутов, а классическую маршрутизацию, я говорю об этом в этом посте: sitecorecommerce.wordpress.com/2014 /11/30/   -  person Stelio    schedule 01.12.2014
comment
У меня такая же проблема. Обновлен с Sitecore 7.2 до 7.5, и я получаю ту же ошибку при запросе через веб-API.   -  person T.J.Kjaer    schedule 20.02.2015
comment
Ребята, вы знаете, было ли это исправлено в последней версии 7.5?   -  person demisx    schedule 16.05.2015


Ответы (1)


Начиная с Sitecore 7.5, они заменяют IHttpControllerSelector по умолчанию своим собственным NamespaceHttpControllerSelector, который не поддерживает маршрутизацию атрибутов.

Однако это можно обойти. Вы должны создать свою собственную версию NamespaceHttpControllerSelector и вставить ее в конвейер initialize после этой:

Sitecore.Services.Infrastructure.Sitecore.Pipelines.ServicesWebApiInitializer, Sitecore.Services.Infrastructure.Sitecore

Я создал как пакет Sitecore, так и пакет NuGet, чтобы сделать это в зависимости от того, что вы предпочитаете и каковы ваши потребности.

Пакет «Пользовательский» создает код в вашем решении, поэтому вы можете редактировать его самостоятельно, если у вас есть особые потребности. Пакет Sitecore и стандартный пакет NuGet просто помещают мою сборку в папку bin и создают файл конфигурации в App_Config\Include, который исправляет конвейер initialize.

Если вы хотите взглянуть на код или узнать больше о проблеме, загляните в мой репозиторий GitHub. .

person Søren Kruse    schedule 22.09.2015