我目前正在使用Web Api 2和EF6以及Code First方法开发OData服务。我的控制器继承了普通的 ApiController Base。
我使用Queryable属性修饰了我的动作方法,并且还在WebApiConfig文件中启用了“查询支持”。通过我的CORS策略,我已将DataServiceVersion和MaxDataServiceVersion指定为我的Accept和Exposed Headers的一部分。
奇怪的是,我的odata端点似乎没有返回 DataServiceVersion 作为响应头的一部分,但是,如果我的控制器继承自ODataController基础,我能够在响应中看到它。
使用ApiController作为基础时,有没有办法启用此标头。
此标头是必需的,因为datajs在客户端需要它。
答案 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等)。
有些值得深思。