我有一个带有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.
我应该为此自定义操作做什么以允许上传?
您需要将操作声明为EDMMODEL的一部分,在以下示例中,我假设您的实体类型为附件,而您的控制器类名称为附件controller 。按照惯例,您的EntitySet名称必须为附件
var attachments = builder.EntitySet<Attachment>("Attachments");
attachments.Action(nameof(AttachmentsController.UploadFile))
.Returns<System.Net.Http.HttpResponseMessage>();
上述语句的重要部分是返回类型,如果您在edmmodel中未正确声明返回类型,那么您将发现端点返回406错误 - 即使方法正确地执行,这确实使人感到困惑您第一次遇到它。这是因为ODATA仍将尝试解析您的响应,以匹配请求之前的Accept标头。
在映射功能和操作而不是"魔术字符串"或常数时尝试使用'namef'
使用这种方法,您不需要方法标头上的路由属性,并且该操作将包含在元数据文档中,因此将摇动输出。