Http响应中缺少DataServiceVersion头

时间:2014-06-10 14:36:11

标签: asp.net-web-api odata asp.net-web-api2 datajs

我目前正在使用Web Api 2和EF6以及Code First方法开发OData服务。我的控制器继承了普通的 ApiController Base。

我使用Queryable属性修饰了我的动作方法,并且还在WebApiConfig文件中启用了“查询支持”。通过我的CORS策略,我已将DataServiceVersion和MaxDataServiceVersion指定为我的Accept和Exposed Headers的一部分。

奇怪的是,我的odata端点似乎没有返回 DataServiceVersion 作为响应头的一部分,但是,如果我的控制器继承自ODataController基础,我能够在响应中看到它。

使用ApiController作为基础时,有没有办法启用此标头

此标头是必需的,因为datajs在客户端需要它。

1 个答案:

答案 0 :(得分:2)

首先回答你的问题: 是的,您可以自己公开DataServiceVersion http标头。它是自定义代码,而不是现有组件的设置。

添加"过滤器"到您的全局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的规范& s& HTTP标头。它还指定了如何交换模型信息,实际的数据交换是预定义的对象结构。简单,但仍然是预定义的结构。

object.d =服务返回内容

您必须自己实现规范的所有部分($ filter,$ metadata,$ top,return formats等)。

有些值得深思。