我有一个带有CRUD标准动词的OData控制器。一切都很好。现在我需要添加一个自定义操作来执行文件上传。我尝试在现有的控制器中添加一个方法,如下所示:
[HttpPost]
[Route("UploadFile")]
public async Task<HttpResponseMessage> UploadFile()
{
//handle uploaded content logic here...
}
但是当我尝试通过POST调用它时:
我收到此错误:
System.InvalidOperationException: No non-OData HTTP route registered.
对于允许上传文件的自定义操作,我该怎么办?
答案 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属性,并且该操作将包含在元数据文档中,因此会显示输出。