我目前正在使用 Web Api 2 和 EF6 以及代码优先方法开发 OData 服务。我的 Controller 继承自普通的 ApiController Base。
我已经使用 Queryable 属性修饰了我的操作方法,并且还在 WebApiConfig 文件中启用了查询支持。通过我的 CORS 策略,我已将 DataServiceVersion 和 MaxDataServiceVersion 指定为我的接受和公开 header 的一部分。
奇怪的是,我的 odata 端点似乎没有返回 DataServiceVersion 作为响应 header 的一部分,但是,如果我的 Controller 继承自 ODataController 基础,我可以在响应中看到它。
有没有办法在使用 ApiController 作为基础时启用此 header 。
需要此 header ,因为 datajs 在客户端需要它。
最佳答案
首先回答你的问题: 是的,您可以自己公开 DataServiceVersion http header 。不过,它是自定义代码,而不是现有组件上的设置。
将“过滤器”添加到您的全局 http 配置中。过滤器是从“System.Web.Http.Filters.ActionFilterAttribute”派生的类。
例如;
internal class DataServiceVersionHeaderFilterWebAPI : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
actionExecutedContext.Response.Content.Headers.Add("DataServiceVersion", "3.0");
actionExecutedContext.Response.Content.Headers.Add("Access-Control-Expose-Headers", "DataServiceVersion");
}
}
然后配置要使用的过滤器(在global.asax的应用程序启动中)
GlobalConfiguration.Configuration.Filters.Add( new DataServiceVersionHeaderFilterWebAPI() );
从安全角度来看,这将允许您进行跨域 OData 查询。然而,这还有另一个问题;
OData 是一个比请求 URI 和 HTTP header 更大的规范。它还指定了如何交换模型信息,实际的数据交换是预定义的对象结构。简单,但仍然是预定义的结构。
object.d = 服务返回内容
您必须自己实现规范的所有这些部分($filter、$metadata、$top、返回格式等)。
一些值得深思的东西。
关于asp.net-web-api - Http 响应中缺少 DataServiceVersion header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24143773/