Поддержка медиаресурсов для OData POST в веб-API

Я хотел бы создать контроллер oData для загрузки файлов

FileDto

  • FILEID
  • NameWithExtension (Тип: String)
  • Метаданные (Тип: Список)
  • Содержимое (Тип: Поток)

========================= Http Request Actions ==================

• GET: ~/Files ({id})

Content-Type: application/json
Result: FileDto without Content

• GET: ~/Files ({id})

Content-Type: application/octet-stream
Result: Stream of the File only

• POST: ~/Files

Content-Type: ?
Body: FileDto with Content
Result: FileId

Не уверен, как я могу достичь этого, когда он связан с OData.

Заранее спасибо

Ответ 1

Эта страница объясняет, как создать oDataController.

1) Чтобы установить пакет в проект, откройте диспетчер консоли и введите следующее:

Install-Package Microsoft.AspNet.Odata

2). Откройте ваш метод WebApiConfig.cs и внутри Register, добавьте этот код:

 ODataModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<FileDto>("File");            
            config.MapODataServiceRoute(
                routeName: "ODataRoute",
                routePrefix: null,
                model: builder.GetEdmModel());

3) Создайте свой oDataController, заменив yourDataSourceHere, чтобы использовать свой собственный класс:

public class FileController : ODataController
{
    [EnableQuery]
    public IQueryable<FileDto> Get()
    {
        return yourDataSourceHere.Get();
    }

    [EnableQuery]
    public SingleResult<FileDto> Get([FromODataUri] int key)
    {
        IQueryable<FileDto> result = yourDataSourceHere.Get().Where(p => p.Id == key);
        return SingleResult.Create(result);
    }

    public IHttpActionResult Post(FileDto File)
    {
        if (!ModelState.IsValid)
            return BadRequest(ModelState);

        yourDataSourceHere.Add(product);

        return Created(File);
    }
}

OBS: Чтобы проверить это решение, я изменил свойство FileDto Content. В частности, это тип! От Stream до byte[]. Отправил контент как строку Base64.