Web Api Odata操作方法使用Get谓词返回404

本文关键字:Get 谓词 返回 Api Odata 操作方法 Web | 更新日期: 2023-09-27 18:27:42

我正试图将文档流公开为特定类型的Action Method。它看起来像这样:

/odata/MyType(123)/stream<--这将返回一个二进制数据流。

当使用GET访问上述端点时,我只得到一个404,即使端点在Controller上公开为[HttpGet]。

从语义上讲,使用Get动词访问此资源是有意义的,因为这只是一个检索数据的操作,而不是副作用。

到目前为止,我只是通过在POST动词下公开action方法来实现这一点。

动作方法控制器的实现目前看起来是这样的:

[HttpPost] // <-- I want this to be [HttpGet]
public HttpResponseMessage Test([FromODataUri] int key, ODataActionParameters parameters)
{
    var fileStream = File.OpenRead(@"c:'somefile");
    return new HttpResponseMessage(HttpStatusCode.OK)
        {
            Content = new StreamContent(fileStream)
        };
}

在"MyType"上注册操作方法的代码

var entityTypeConfiguration = mapper.Builder.Entity<MyType>();
var actionConfiguration = entityTypeConfiguration.Action("stream");
actionConfiguration.Returns<HttpResponseMessage>();

该实现受到本文的启发:http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-actions

有人知道我如何可能将此操作方法公开为Get吗?

Web Api Odata操作方法使用Get谓词返回404

这个问题很老了,但我一直在努力解决这个问题,我在我的案例中找到的解决方案可能对其他人有用:将"Action"GET定义为"Function"而不是"Action"。

在问题中提出的场景中,这将是:

var actionConfiguration = entityTypeConfiguration.Function("stream");

文档中建议这样做:"操作和函数之间的区别在于,操作可能有副作用,而函数没有。操作和函数都可以返回数据。"

OData具有更好的语义来公开实体的流。您可以使用命名流或媒体链接条目(MLE)。在这里和这里阅读。

命名流似乎更适合您的场景。这里有一个示例,展示了如何使用web API OData中的可扩展性点来执行命名流。