我正在尝试将文档流公开为特定类型的操作方法.它看起来像这样:
/ odata / MyType(123)/ stream<-返回二进制数据流. 使用GET访问上述端点时,即使端点在Controller上显示为[HttpGet],我也只会得到404. 从语义上讲,使用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?
解决方法:
OData具有更好的语义,可以公开实体的流.您可以使用命名流或媒体链接条目(MLE).阅读有关here和here的信息.
命名流似乎更适合您的情况.我有一个样本here,该样本显示了如何使用Web API OData中的可扩展性点来执行命名流.