2016-04-12 4 views
0

Я перемещаю весь/весь мой API в проект до Одаты из «чистого» WCF и используя для этого Opoint для ODAIN.WebApi & Odata - подходит для управления файлами?

Единственный элемент, с которым я застрял в данный момент, это файлы. У меня есть 2 области, где мне нужно загрузить ZIP-файл на сервер для обработки. В одном случае, который привязан к Entity (называемому «репозиторием») и содержит двоичный контент, который не отображается через Odata (он просто загружен). С другой стороны, это для несвязанного действия, и ZIP-файл содержит файлы конфигурации, которые будут разбивать/изменять количество объектов.

Возможно ли это с помощью OData, или я должен игнорировать Odata для этого и идти с стандартными конечными точками «с ручной настройкой»? Я действительно хотел бы сохранить это в Odata из-за выставленных метаданных.

Прежде чем комментировать - я пытался найти документацию через Google, но я не получаю никаких соответствующих ответов. Ответы, которые я вижу, показывают, что это возможно, но у всех есть примеры кода, указывающие на старый API уровня WCF, в то время как я использую WebApi. Документация по адресу http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v4/create-an-odata-v4-endpoint не содержит слишком много деталей. Он не показывает разрешенные типы для конфигурации параметров для действия и как настроить его для приема файла через http-сообщение из веб-формы (и клиента, потому что мне понадобятся оба).

+0

Вы проверили это: http://stackoverflow.com/questions/30043442/stream-support-in-odata-v4 –

+0

Помните, что я говорю о файлах. Это байтовые массивы. Отправка файла ZIP в действие. – TomTom

+0

Вы должны объяснить, что именно вы хотите сделать, возможно, с некоторым примером кода. Это то, что вам нужно? http://stackoverflow.com/questions/23440933/media-resource-support-for-odata-post-in-web-api –

ответ

3

Вот полезная ссылка с документацией о поддержке ресурсов СМИ для OData в Web API: https://blogs.msdn.microsoft.com/mrtechnocal/2013/10/31/media-resource-support-for-odata-in-web-api/

Вы можете упростить немного реализации предложенной в ссылке, но наверняка вам понадобится:

  • Создать контроллер ресурсов OData Media Resource. Это может быть проще, чем предлагаемое в документе. Смотри ниже.
  • Создайте пользовательскую EntityRoutingConvention, чтобы правильно маршрутизировать методы Get, которые будут возвращать ZIP-файлы (в случае, если у вас есть этот прецедент, если вам нужно только выполнить POST, вам может не понадобиться специальное соглашение о маршрутизации).

Таким образом, для контроллера, вы можете иметь:

public abstract class YourMediaResourceODataController<TEntity, TKey> 
    : ODataController where TEntity : class 
{ 
} 

, а затем реальный контроллер:

public class YourController : YourMediaResourceODataController<YourZIPObjectEntity, string> 
{ 
    // This would be the post 
    public async Task<IHttpActionResult> Post() 
    { 
     var stream = await Request.Content.ReadAsStreamAsync(); 
     // Manage the stream 
    } 

    // The get (if you want it, you will need to code the custom EntityRoutingConvention). 
    [HttpGet] 
    public HttpResponseMessage GetMediaResource(string key) 
    { 
     HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK); 

     var theZIPFile = yourZIPFileService.GetZIPFileByKey(key); 
     StreamContent contentResult; 
     using(var ms = new MemoryStream(theZIPFile.theByteArray) 
     { 
      contentResult = new StreamContent(ms); 
     } 

     result.Content = contentResult; 
     return result; 
    } 
} 

Вам нужно будет иметь объект YourZIPObjectEntity с потоком/байт [ ]/string, в зависимости от того, как вы управляете двоичным файлом. (В примере документации это класс Image). И для этого объекта вам нужно будет указать, что он имеет поток в ODataConfig (см. Раздел «Настройка конфигурации веб-API» в документации).

Я думаю это почти все.

Затем, вы можете, с помощью кода, POST своих ZIP файлов как StreamContent:

using(var requestContent = new MemoryStream(yourByteArray)) 
using(var request = new HttpRequestMessage(HttpMethod.POST, yourPOSTUri) 
{ 
    request.Content = new StreamContent(requestContent); 
    // Set headers and send the request... 
} 

Я надеюсь, что это решение, которое вы ищете, или, по крайней мере, подход к нему.

-1

Для файлов с простым двоичным содержимым вы можете использовать WebApi, а не OData. Если нет хранилища файлов, которые вы хотите обслуживать для потребителя.

Если вы должны загружать zip-файлы и обрабатывать их вручную, чтобы изменять объекты, которым не нужно использовать OData. Однако WebApi OData обеспечивает поддержку пакетных транзакций. Вы можете следовать этому руководству: https://blogs.msdn.microsoft.com/webdev/2013/11/01/introducing-batch-support-in-web-api-and-web-api-odata/

Опять же, если у вас есть большие партии, а не отправка почтовых файлов, используйте сжатие gZip. Вот аккуратный пост о поддержке WebAPI GZIP: https://damienbod.com/2014/07/16/web-api-using-gzip-compression/

+0

Я-1, потому что я нашел бы неправильным, если бы получил 200 очков. Причина использования OData заключается в том, что это часть опубликованного и схематизированного API. Причина для ZIP заключается в том, чтобы облегчить загрузку созданных извне нескольких файлов в контейнере для обновления конфигураций большого количества объектов на стороне сервера, которые не будут обрабатывать ZIP-сжатие (в основном: он не будет обрабатывать пользователя, готовящего архив с цифровой подписью манифест, который затем загружается как один файл). – TomTom

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