2014-09-04 3 views
9

Как я могу использовать odata v3 и v4 api, работающие бок о бок в одном проекте?webApi2 Odata v3 и V4 бок о бок

Может ли тот же контроллер возвращать данные в обоих форматах? Должен ли я иметь 2 копии одного контроллера - по одному на версию Odata?

Я знаю, что это должно быть возможным, потому что официальная страница WEBAPI говорит, что она предназначена для.

«ASP.NET Web API поддерживает как v3, так и v4 протокола. У вас даже может быть конечная точка v4, которая работает бок о бок с конечной точкой v3». - цитата из www.asp.net

Вопрос - как это сделать? Любые учебники?

+0

Просто отправьте ссылку на проблему ASP.Net по этой проблеме и дублированию кода https://aspnetwebstack.codeplex.com/workitem/2184 – Marty

ответ

4

Образец для бок о бок: https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataSxSSample/, FYI. Этот образец имеет 2 копии одного и того же контроллера.

+2

Есть ли способ «повторно использовать» тот же контроллер? потому что они отличаются только операциями 'using', и, кроме этого, это 100% дубликат. – Marty

0

Это немного зависит от реализации OData. Я знаю, что WCF поддерживает заголовок OData-Version:

http://docs.oasis-open.org/odata/odata/v4.0/os/part1-protocol/odata-v4.0-os-part1-protocol.html#_Toc372793615

, что клиент может использовать, чтобы указать версию, что он хочет, и WCF будет действовать надлежащим образом только с 1 конечной точки.

WebAPI, с другой стороны, я не знаю, но, вероятно, стоит проверить.

4

Да, вам нужен два набора контроллеров. V4 не обеспечивает обратной совместимости.

Существует также еще один образец для контроля версий: https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ODataVersioningSample/

Это правильное решение для вас. Вы делаете первую версию (~/api/v1 /) для OData V3 и вторую версию (~ api/v2 /) для V4. Это обеспечивает лучшее разделение.

+0

. Обратите внимание, что вам все еще нужно иметь два разных проекта: один ссылается на OData v3 libs и один ссылается на OData v4 libs, как показано в 'ODataSxSSample' , – Dejan

+0

Нет. У вас нет. Я создал один проект так же, как и ссылку, которую я разместил. У меня есть ссылки на библиотеки V3 и V4. Он работает отлично. – maomao

+0

Вы используете NuGet? – Dejan

0

Чтобы суммировать шаги, которые достаточно просты, без необходимости загрузки образца, nuget Microsoft.AspNet.WebApi.Odata для v3 и Microsoft.AspNet.OData для v4. Начиная с v3 и v4, связанных с соглашениями по умолчанию, вы получите дублируемое имя контроллера. Измените префикс маршрута v3 по умолчанию на «odata/v3» (не обязательно, но рекомендуется), а для v4 установите префикс маршрута по умолчанию на «odata/v4» и переименуйте контроллер в MyEntityV4Controller. На этом этапе попытка использовать атрибуты маршрута для решения ошибки приведет к результату http 406. Вместо этого создайте класс:

public class CustomControllerRoutingConvention : IODataRoutingConvention 
{ 
    public string SelectAction(ODataPath odataPath, HttpControllerContext controllerContext, ILookup<string, HttpActionDescriptor> actionMap) 
    { 
     return null; 
    } 

    public string SelectController(ODataPath odataPath, HttpRequestMessage request) 
    { 
     if (odataPath.EdmType == null) 
      return null; 
     var path = odataPath.Segments.OfType<EntitySetPathSegment>().SingleOrDefault(); 
     if (path == null) 
     { 
      return null; 
     } 
     return path.EntitySetName + "V4"; 
    } 
} 

И использовать его в качестве так:

config.MapODataServiceRoute(
      "odatav4", 
      "odata/v4", 
      builder.GetEdmModel(), 
      new DefaultODataPathHandler(), 
      routingConventions); 

Здесь вы сможете перейти к OData/v3/MyEntitys и OData/v4/MyEntitys и т.д.