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

Dar*_*ran 5 odata asp.net-web-api

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

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

这一切都很美妙,Excel 2013愉快地访问数据.

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

我设置了我的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的集合,例如,http://localhost/Products而不是http://localhost/odata/Products它应该.

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

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

小智 3

我在使用 PowerPivot 时遇到了同样的问题,我设法修复 xml:base 使其与其兼容。这是所需的代码部分:

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

config.Routes.MapODataRoute("odata", "odata", builder.GetEdmModel(), new MyODataPathHandler(), ODataRoutingConventions.CreateDefault());
Run Code Online (Sandbox Code Playgroud)

自定义 ODataPathHandler 将为默认路径添加额外的斜杠,这会生成一个 xml:base 来解决 PowerPivot 中的错误。第二个问题是 PowerPivot 需要 XML 格式的数据,而不是 JSON 格式的数据。可以在http://aspnetwebstack.codeplex.com/workitem/820找到一种解决方法