我有一个带有CRUD标准谓词的OData控制器。一切都很好。现在我需要添加一个自定义操作来执行文件上传。我尝试在我现有的控制器中添加如下方法:
[HttpPost]
[Route("UploadFile")]
public async Task<HttpResponseMessage> UploadFile()
{
//handle uploaded content logic here...
}但是当我试图通过写一个帖子来调用它时:
http://localhost/UploadFile
我知道这个错误:
System.InvalidOperationException: No non-OData HTTP route registered.对于允许文件上传的自定义操作,我应该做什么?
发布于 2018-01-31 22:17:59
您需要将Action声明为EdmModel的一部分,在下面的示例中,我假设您的实体类型是附件,而控制器类名为AttachmentsController。按照惯例,您的EntitySet名称必须是附件。
var attachments = builder.EntitySet<Attachment>("Attachments");
attachments.Action(nameof(AttachmentsController.UploadFile))
.Returns<System.Net.Http.HttpResponseMessage>();上述语句的重要部分是返回类型,如果您没有在EdmModel中正确声明返回类型,那么您将发现您的端点返回了406个错误--即使您的方法执行正确,这在您第一次遇到它时也会非常混乱。这是因为在完成响应之前,OData仍然会尝试解析您的响应,以匹配来自请求的Accept。
在映射函数和操作时,尝试使用“nameof”,而不是“魔术字符串”或常量,这样编译器就可以处理诸如错误定义的路由之类的基本问题。
使用这种方法,您不需要方法头上的路由属性,该操作将包含在元数据文档中,因此将包含在swagger输出中。
https://stackoverflow.com/questions/44401248
复制相似问题