3

我正在尝试将文档流公开为特定类型的操作方法。它看起来像这样:

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

使用 GET 访问上述端点时,我只得到 404,即使端点在控制器上显示为 [HttpGet]。

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

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

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

[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?

4

2 回答 2

3

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

在问题中提出的情况下,这将是:

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

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

于 2016-03-16T12:00:55.313 回答
0

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

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

于 2013-08-15T00:35:43.667 回答