2015-11-01 2 views
1

У меня есть этот контроллер:Web API 2 OData V4 PATCH вернуть 404

using System.Web.Http; 
using System.Web.OData; 

public class InvRecipientAutoInvoiceController : ODataController 
    { 
     // GET: odata/InvRecipientAutoInvoice 
     [EnableQuery] 
     public IQueryable<Inv_RecipientAutoInvoice> GetInvRecipientAutoInvoice() 
     { 
      return db.Inv_RecipientAutoInvoice.Where(a=>a.CompanyNumber == CompanyNumber); 
     } 

    [AcceptVerbs("PATCH", "MERGE")] 
    public IHttpActionResult Patch([FromODataUri] int RecipientNumber , [FromODataUri] int RecipientType, Delta<Inv_RecipientAutoInvoice> patch) 
     { 
      // XXXX Some Update Code 
     } 
    } 

ГЭТ работает и я получаю результат и даже может сортировать их. но когда я делаю запрос PATCH, я получаю 404 ошибку, запрос PATCH:

Запрос URL: http://localhost:61240/odata/InvRecipientAutoInvoice(RecipientNumber%3D443%2CRecipientType%3D400)

Request Method: PATCH 
  • Response Body:

{ «ошибка ": { " code ":" "," message ":" Не найден ресурс HTTP, соответствующий запросу URI 'http://localhost:61240/odata/InvRecipientAutoInvoice(RecipientNumber=443,RecipientType=400) «.», «Innererror»: { «message»: «На контроллере« InvRecipientAutoInvoice »не найдено никаких действий, которые соответствуют запросу .», «Type»: «", "stacktrace": "" }} }

  • тело запроса:
{"InvoiceLine1Description":"32132"} 

Я использую его в веб-проекте ASP.net (не MVC),

регистр является:

config.MapODataServiceRoute(
routeName: "ODataRoute", 
routePrefix: "odata", 
model: builder.GetEdmModel()); 

Что мне не хватает?

ответ

0

@yaniv

кажется, что вы хотите использовать встроенный в конвенциях маршрутизации пропатчить сущность с составными ключами. Однако the built-in routing conventions не поддерживает составные клавиши.

Вы можете настроить свои собственные правила маршрутизации (см. here) или просто использовать attribute routing.

Маршрутизация атрибутов проста и проста в использовании. Вам нужно только поставить ODataRouteAttribute на ваш патч действий, то он должен работать.

[AcceptVerbs("PATCH", "MERGE")] 
[ODateRoute("InvRecipientAutoInvoice(RecipientNumber={RecipientNumber},RecipientType={RecipientType})"] 
public IHttpActionResult Patch([FromODataUri] int RecipientNumber , [FromODataUri] int RecipientType, Delta<Inv_RecipientAutoInvoice> patch) 
{ 
    // XXXX Some Update Code 
} 

Спасибо.

0

Когда вы делаете звонок, какой запрошенный контент? Это приложение/json-patch + json? (Вместо приложения/JSON)

Смежные вопросы