Web API中OData POST的媒体资源支持

Nav*_*vap 12 odata asp.net-web-api

我想创建oData控制器来上传文件

FileDto

  1. FILEID
  2. NameWithExtension(Type:String)
  3. 元数据(类型:列表)
  4. 内容(类型:流)

========================= Http请求操作==================

•GET:〜/ Files({id})

Content-Type: application/json
Result: FileDto without Content
Run Code Online (Sandbox Code Playgroud)

•GET:〜/ Files({id})

Content-Type: application/octet-stream
Result: Stream of the File only
Run Code Online (Sandbox Code Playgroud)

•POST:〜/ Files

Content-Type: ?
Body: FileDto with Content
Result: FileId
Run Code Online (Sandbox Code Playgroud)

当与OData结合时,我不确定如何实现这一目标.

提前致谢

Ric*_*nte 3

本页介绍如何创建 oDataController。

1)要在项目上安装软件包,请打开控制台管理器并输入以下内容:

Install-Package Microsoft.AspNet.Odata
Run Code Online (Sandbox Code Playgroud)

2)打开你的方法,WebApiConfig.csRegister方法中添加以下代码:

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

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

OBS:为了测试这个解决方案,我更改了 的FileDto属性Content。更具体地说,它是类型!从Streambyte[]。将内容发布为 Base64 字符串。