Asp.net web api Http响应中缺少DataServiceVersion标头

Asp.net web api Http响应中缺少DataServiceVersion标头,asp.net-web-api,odata,asp.net-web-api2,datajs,Asp.net Web Api,Odata,Asp.net Web Api2,Datajs,我目前正在使用WebAPI2和EF6以代码优先的方式开发OData服务。我的控制器继承自正常的ApiController基 我用Queryable属性修饰了我的操作方法,并且在WebApiConfig文件中启用了查询支持。通过我的CORS策略,我已经将DataServiceVersion和MaxDataServiceVersion指定为我的Accept和Exposed头的一部分 奇怪的是,我的odata端点似乎没有将DataServiceVersion作为响应头的一部分返回,但是,如果我的控制器

我目前正在使用WebAPI2和EF6以代码优先的方式开发OData服务。我的控制器继承自正常的ApiController

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

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

在使用ApiController作为基础时,是否有办法启用此标题


这个头是需要的,因为datajs在客户端需要它

首先回答您的问题: 是的,您可以自己公开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的应用程序启动中)

这将允许您从安全角度进行跨域OData查询。然而,这还有另一个问题

OData是一个比请求URI和HTTP头更大的规范。它还指定了如何交换模型信息,而实际的数据交换是预定义的对象结构。简单,但仍然是预定义的结构

object.d=服务返回的内容

您必须自己实现所有这些规范($filter、$metadata、$top、return格式等)


值得思考。

在我的客户机上使用breeze时,我试图查询使用ApicController的Odata端点。对服务的查询将成功,但结果将在my promise的失败处理程序中返回。把注意力集中在这个问题上,我开始明白,发送DataServiceVersion并不像您上面提到的那样有效。同样,从OdataController/EntitySetController继承的控制器似乎也起到了作用;正在将输出返回给成功处理程序。不过,我不得不修改Cors策略以公开dataservice和maxdataservice版本。
GlobalConfiguration.Configuration.Filters.Add( new DataServiceVersionHeaderFilterWebAPI() );