【问题标题】:OData v4 Custom Action for File Upload用于文件上传的 OData v4 自定义操作
【发布时间】:2017-06-06 23:30:51
【问题描述】:

我有一个带有 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.

我应该为这个自定义操作做什么以允许文件上传?

【问题讨论】:

    标签: c# .net odata


    【解决方案1】:

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

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

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

    在映射函数和动作时尝试使用“nameof”而不是“魔术字符串”或常量,以便编译器能够处理一些基本问题,例如错误定义的路由。

    使用这种方法,您不需要方法头上的 Route 属性,并且该操作将包含在元数据文档中,因此会大张旗鼓地输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-05
      • 1970-01-01
      • 2019-04-08
      • 2015-07-06
      • 1970-01-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多