OData v4文件上传自定义操作

时间:2017-06-06 23:30:52

标签: c# .net odata

我有一个带有CRUD标准动词的OData控制器。一切都很好。现在我需要添加一个自定义操作来执行文件上传。我尝试在现有的控制器中添加一个方法,如下所示:

[HttpPost]
[Route("UploadFile")]
public async Task<HttpResponseMessage> UploadFile()
{
    //handle uploaded content logic here...
}

但是当我尝试通过POST调用它时:

http://localhost/UploadFile

我收到此错误:

System.InvalidOperationException: No non-OData HTTP route registered.

对于允许上传文件的自定义操作,我该怎么办?

1 个答案:

答案 0 :(得分:0)

您需要将Action声明为EdmModel的一部分,在以下示例中,我假设您的实体类型是 Attachment ,并且您的控制器类名称是 AttachmentsController 。按照惯例,您的EntitySet名称必须是附件

var attachments = builder.EntitySet<Attachment>("Attachments");
attachments.Action(nameof(AttachmentsController.UploadFile))
    .Returns<System.Net.Http.HttpResponseMessage>();

上述语句的重要部分是返回类型,如果你没有在EdmModel中正确声明返回类型,那么你会发现你的端点返回406错误 - 不可接受,即使你的方法正确执行,这实在令人困惑第一次遇到它。这是因为在完成响应之前,OData仍会尝试解析您的响应以匹配请求中的Accept标头。

  

尝试使用&#39; nameof&#39;映射函数和动作而不是“魔术字符串”时或常量,以便编译器可以拾取错误定义的路由等基本问题。

使用这种方法,您不需要方法标题上的Route属性,并且该操作将包含在元数据文档中,因此会显示输出。