在WebApi OData中将OData服务文档基本URL作为尾部斜杠

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

我使用WebApi, System.Web.Http.OData.Builder.ODataConventionModelBuilder以及从System.Web.Http.OData.ODataController继承的控制器来设置OData服务

这一切都运行得很好,Excel 2013很高兴地访问数据。

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

我已经使用config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel());设置了我的odata路由config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel()); 当我打这个URL时,我得到了一个<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中的URI的集合,例如http://localhost/Products而不是http://localhost/odata/Products正如它应该。

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

我已经尝试通过ASP.Net WebStack源代码来查看是否可以重写格式化程序或其他东西,但是已经丢失。 任何建议将不胜感激。


我与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

链接地址: http://www.djcxy.com/p/20401.html

上一篇: Give OData service document base URL a trailing slash in WebApi OData

下一篇: Returning PageResult from WebAPI not formatting as OData