asp.net-web-api - Http 响应中缺少 DataServiceVersion header

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

我目前正在使用 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/

相关文章:

c# - 由于包装器,使用 $expand 的 OData 中断了强制转换操作

c# - .NET Web API 模型绑定(bind)前缀属性

javascript - 带有单个字符串参数的 WebApi 2 POST 不起作用

Angular 2 - 在从 Angular 2 发送到 Web API 时加密密码

c# - SingleResult.Create 在空 IQueryable 上的 Odata 序列化错误

休息API : Distance unit of measurement

asp.net-web-api - 使用apicontroller vs odata EntitySetController

c# - 获取url中所有参数

entity-framework - net core odata put和patch嵌套数据结构

c# - Web API 响应中的自定义 404 错误消息