使用Get动词返回404的Web Api Odata动作方法

时间:2013-08-14 12:09:28

标签: c# asp.net odata asp.net-web-api

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

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

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

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

到目前为止,我只是通过在POST-verb下公开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?

2 个答案:

答案 0 :(得分:3)

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

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

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

the documentation中建议这样做:“操作和功能之间的区别在于操作可能有副作用,而功能则没有。操作和功能都可以返回数据。”

答案 1 :(得分:0)

OData具有更好的语义来暴露实体的流。您可以使用命名流或媒体链接条目(MLE)。阅读herehere

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