我正在尝试将文档流公开为特定类型的操作方法。它看起来像这样:
/ 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?
答案 0 :(得分:3)
问题是陈旧的,但我一直在努力解决这个问题,我在案例中找到的解决方案可能对其他人有用:将“行动”GET定义为“功能”而不是“行动”。
在问题中提出的情景中,这将是:
var actionConfiguration = entityTypeConfiguration.Function("stream");
在the documentation中建议这样做:“操作和功能之间的区别在于操作可能有副作用,而功能则没有。操作和功能都可以返回数据。”
答案 1 :(得分:0)