2013-08-14 1 views
3

Я пытаюсь выставить поток документа как метод действия для определенного типа. Это выглядело бы примерно так:Web Api Методы действий Odata с использованием Get verb return 404

/odata/MyType (123)/stream < - это возвращает двоичный поток данных.

При доступе к вышеуказанной конечной точке с использованием GET я получаю только 404, хотя конечная точка отображается как [HttpGet] на контроллере.

С помощью Sematic было бы разумно получить доступ к этому ресурсу с помощью Get-глагола, поскольку это просто операция для извлечения данных, а не побочных действий.

До сих пор я только получил это, чтобы разоблачить метод действия под POST-глаголом.

Действие реализации контроллера метода в настоящее время выглядит следующим образом:

[HttpPost] // <-- I want this to be [HttpGet] 
public HttpResponseMessage Test([FromODataUri] int key, ODataActionParameters parameters) 
{ 
    var fileStream = File.OpenRead(@"c:\somefile"); 

    return new HttpResponseMessage(HttpStatusCode.OK) 
     { 
      Content = new StreamContent(fileStream) 
     }; 
} 

Код для регистрации методы действия на «MyType»

var entityTypeConfiguration = mapper.Builder.Entity<MyType>(); 
var actionConfiguration = entityTypeConfiguration.Action("stream"); 
actionConfiguration.Returns<HttpResponseMessage>(); 

Реализация вдохновлена ​​эта статья: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions

Кто-нибудь знает, как я могу разоблачить этот метод действий как Get?

+0

Какая ошибка возникает при изменении атрибута на '[HttpGet]'? – Prescott

+0

В спецификации OData действия должны вызываться с помощью POST, потому что они могут иметь побочные эффекты. http://www.odata.org/documentation/odata-v3-documentation/odata-core/#10413_Invoking_an_Action –

+0

Прескотт: я получаю 404. Обновлен мой вопрос. –

ответ

0

OData имеет лучшую семантику для отображения потоков для объекта. Вы можете использовать именованные потоки или запись Media Link (MLE). Читайте об этом here и here.

Названные потоки, похоже, лучше подходят для вашего сценария. У меня есть образец here, который показывает, как использовать точки расширяемости в веб-API OData для создания именованных потоков.

3

Вопрос старый, но я боролся с этим, и решение, которое я нашел в моем случае, может быть полезно для других: определите «действие» GET как «функцию» вместо «действия».

В сценарии, представленном в этом вопросе, это было бы:

var actionConfiguration = entityTypeConfiguration.Function("stream"); 

Это рекомендуется в the documentation: «Разница между действиями и функциями является то, что действия могут иметь побочные эффекты, а также функции, не оба. действия и функции могут возвращать данные ».

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