2

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

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

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

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

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

4

1 回答 1

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 和 HTTP 标头更大的规范。它还指定了如何交换模型信息,而实际的数据交换是一个预定义的对象结构。简单,但仍然是预定义的结构。

object.d = 服务返回的内容

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

一些值得深思的食物。

于 2014-07-25T10:07:43.167 回答