【问题标题】:Bad OData Format when accessing OData feed from Tableau 8.1从 Tableau 8.1 访问 OData 源时 OData 格式错误
【发布时间】:2014-06-30 22:48:28
【问题描述】:

我在连接到 OData 源时遇到问题,因为我收到以下错误消息: “错误的 OData 格式。确保您使用的 URL 指向有效的 OData 源”

我可以在浏览器中访问该 url(并获得预期的 JSON 响应),并且可以通过 Excel (Power Query) 连接到 OData 源。

有人有类似的问题吗?你认为问题是什么?

我在 Windows 8 中使用 Tableau 8.1,并且正在通过 ASP.NET Web API 2 开发我的 OData 服务。

【问题讨论】:

  • 尝试使用fiddler跟踪get OData feed的http请求/响应,验证是OData问题还是Power Query问题?
  • 您在 Tableau 中使用的是哪种 URL?服务文档或特定实体集。我认为 Tableau 只处理后者。

标签: json excel asp.net-web-api odata tableau-api


【解决方案1】:

Tableau 9.0 版在使用 Web API OData 时仍然存在此问题,之所以这样做,是因为 Tableau 要求数据为 XML 格式,但不发送 Accept 标头让服务器知道。

这对我有用。我修改了这段代码(替换了 YourDatabaseEntities 和 YourTable)并将其添加到 Microsoft 脚手架创建的每个控制器:

/// <summary>
/// Class YourTableController.
/// </summary>
public class YourTableController : ODataController
{
    /// <summary>
    /// The database
    /// </summary>
    private YourDatabaseEntities db = new YourDatabaseEntities();
    /// <summary>
    /// Adds Accept header for Tableau which requires XML data but doesn't send a header requesting it
    /// </summary>
    protected void FTLP()
    {
        try
        {
            Request.Headers.Remove("Accept");
        }
        catch { }
        try
        {
            Request.Headers.Add("Accept", "application/atom+xml");
        }
        catch { }
    }
    // GET: odata/YourTable
    /// <summary>
    /// Gets the Your Table.
    /// </summary>
    /// <returns>IQueryable&lt;YourTable&gt;.</returns>
    [EnableQuery]
    public IQueryable<YourTable> GetYourTable()
    {
        FTLP();//Add this to Fix Tableau XML requirement 
        return db.YourTable;
    }

    // GET: odata/YourTable(5)
    /// <summary>
    /// Gets the YourTable.
    /// </summary>
    /// <param name="key">The key.</param>
    /// <returns>SingleResult&lt;YourTable&gt;.</returns>
    [EnableQuery]
    public SingleResult<YourTable> GetYourTable([FromODataUri] DateTime key)
    {
        FTLP();//Add this to Fix Tableau XML requirement 
        return SingleResult.Create(db.YourTable.Where(YourTable => YourTable.Date == key));
    }

///////

【讨论】:

【解决方案2】:

在此处检查 Tableau 日志中的错误消息:我的文档 > 我的 Tableau 存储库 > 日志 > log.txt

在我们的例子中,我们看到 Tableau 将 $inlinecount=allpages 附加到 OData URL,这在 OData v4 中失败了:

{"error":{"code":null,"message":"系统查询选项 '$inlinecount' 未定义。"}}

Tableau 仅支持 OData v2。 Denodo 可以同时支持这两个版本。我们安装了 v2,我们能够成功连接。以下是来自 Tableau 支持的反馈:

根据 Microsoft 的这篇文章,inlinecount 函数是 不包含在 OData 版本 4 中: https://msdn.microsoft.com/en-us/library/dd942040.aspx。这是其中之一 Tableau Desktop 无法连接到该版本的原因 OData。

我能找到的唯一记录 OData V2 要求的 Tableau 文档是:

Tableau 连接 OData V2,不支持浏览 OData 服务文件。 http://onlinehelp.tableau.com/current/pro/online/windows/en-us/help.htm#examples_odata.html

我们最初根据此处的其他答案担心 json 与 atom 格式,但这对我们来说不是问题。连接正常后,我们意识到 Tableau 无法使用与 OData 的实时连接,因此我们还是恢复了 ODBC!

TL;DR 确保您使用的是 OData V2 而不是 OData 服务文档(截至 2016 年 8 月,Tableau v 9.3.5 及更低版本)。

【讨论】:

    【解决方案3】:

    有 2 个选项可以解决此问题:

    1. 将“application/json”添加到 Accept 标头。
    2. 将 $format 附加到原始 URL,例如 ~/Employees?$format=application/json

    现在在最新的 ODL(6.3) 中,除了元数据文档之外,payload 只支持 json。

    【讨论】:

    • 如果您明确请求 json 作为格式,Tableau 将返回一个错误,因为它只接受 AtomPub
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2011-05-08
    相关资源
    最近更新 更多