在WebApi OData中为OData服务文档基URL提供一个尾部斜杠

时间:2014-01-30 17:19:19

标签: asp.net-web-api odata

如何在OData服务文档的根元素中控制基本URL属性?

我正在使用WebApi设置OData服务,System.Web.Http.OData.Builder.ODataConventionModelBuilder和继承自System.Web.Http.OData.ODataController的控制器

一切都很好,Excel 2013很乐意访问数据。

尝试使用Excel 2010和PowerPivot时出现问题。我知道在没有Accept标头的情况下发送的fix JSON格式的响应,但我找不到任何有关基本URL问题的讨论。

我已使用config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());设置了我的odata路线,当我点击此网址时,我收到<service xml:base="http://localhost/odata" xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom"/>

的回复

Excel 2010 + PowerPivot读取此URL并确定由于基URI上没有尾部斜杠,因此它应该请求根目录中包含URI的集合,例如: <{1}}而不是http://localhost/Products

我通过访问服务文档的静态版本来确认我的怀疑,修改后将尾部斜杠添加到基本属性值,然后为集合资源请求正确的URL。

我尝试过使用ASP.Net WebStack源代码来查看是否可以覆盖格式化程序或其他内容,但是迷路了。任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:3)

我遇到了与PowerPivot相同的问题,我设法修复了xml:base以与之兼容。这是所需代码的一部分:

class MyODataPathHandler : DefaultODataPathHandler
{
    public override string Link(ODataPath path)
    {
        if (path.PathTemplate == "~")
        {
            return path.ToString() + "/";
        }
        return base.Link(path);
    }
}

config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel(), new MyODataPathHandler(), ODataRoutingConventions.CreateDefault());

自定义ODataPathHandler将为默认路径添加额外的斜杠,这将导致xml:base解决PowerPivot中的错误。第二个问题是PowerPivot期望XML中的数据,而不是JSON中的数据。可以在http://aspnetwebstack.codeplex.com/workitem/820

找到一种解决方法