【问题标题】:DataServiceVersion header missing in the Http responseHttp 响应中缺少 DataServiceVersion 标头
【发布时间】:2014-06-10 14:36:11
【问题描述】:

我目前正在使用 Web Api 2 和 EF6 和代码优先方法开发 OData 服务。我的控制器继承自普通的 ApiController 基础。

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    首先回答您的问题: 是的,您可以自己公开 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 和 HTTP 标头更大的规范。它还指定了如何交换模型信息,而实际的数据交换是一个预定义的对象结构。简单,但仍然是预定义的结构。

    object.d = 服务返回的内容

    您必须自己实现规范的所有部分($filter、$metadata、$top、返回格式等)。

    值得深思。

    【讨论】:

    • 在我的客户端上使用微风时,我试图查询使用 ApiController 的 Odata 端点。对服务的查询会成功,但结果会在我的 promise 的失败处理程序中返回。在解决这个问题时,我了解到发送 DataServiceVersion 是行不通的,正如您上面提到的那样。同样,从 OdataController/EntitySetController 继承的控制器似乎可以解决问题。输出被返回到成功处理程序。我不得不修改 Cors 策略以公开 dataservice 和 maxdataservice 版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 2018-04-25
    • 2018-07-02
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多