簡體   English   中英

在C#中調用'DataWarehouseGetReportData'時API異常

[英]API exception while calling 'DataWarehouseGetReportData' in C#

我正在使用Omniture api下載報告。 當我使用DataWarehouseCheckRequest方法檢查狀態時,報告已完成。 現在,當我嘗試使用DataWarehouseGetReportData方法獲取報告時,我得到

CommunicationException Error in deserializing body of reply message for operation 'DataWarehouseGetReportData

內部異常說

The specified type was not recognized: name='data_warehouse_report_row', namespace='http://www.omniture.com/', at <rows xmlns=''>

我是C#和API的新手。 不知道如何解決這個問題。 請幫忙。

謝謝

當您要下載DW報告時,最好的選擇是通過http進行報告。 這是標准方式,效率更高。

對CheckRequest的響應包含一個DataURL。 用它來下載數據。

這是我用於幾乎相同的API(Partner vs you Enterprise API)的一些c#示例代碼(請注意,我也不是c#專家,因此您需要對此進行代碼審查)。

        HttpWebResponse statusResponse = null;
        string response = "";
        StringBuilder sbUrl = new StringBuilder(dwrq.data_url);   // hardcode to variable "rest_url" for testing.
        HttpWebRequest omniRequest = (HttpWebRequest)WebRequest.Create(sbUrl.ToString());
        string timecreated = generateTimestamp();
        string nonce = generateNonce();
        string digest = getBase64Digest(nonce + timecreated + secret);
        nonce = base64Encode(nonce);
        omniRequest.Headers.Add("X-WSSE: UsernameToken Username=\"" + username + "\", PasswordDigest=\"" + digest + "\", Nonce=\"" + nonce + "\", Created=\"" + timecreated + "\"");
        omniRequest.Method = "GET";  // Switched from POST as GET is the right HTTP verb in this case

        try
        {
            statusResponse = (HttpWebResponse)omniRequest.GetResponse();
            using (Stream receiveStream = statusResponse.GetResponseStream())
            {
                using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8))
                {
                    response = readStream.ReadToEnd();
                }
            }
        }
        catch (Exception ex)
        {
            throw new Exception(ex.Message);
        }
        Console.WriteLine("Response is a TAB delimeted CSV structure. Printing to screen.");
        Console.WriteLine(response);
        Console.WriteLine("Ending REST...");
        Console.WriteLine("Ending ExportRequestSegmentedData...");

及其支持方法

    /*** Here are the private functions ***/
    // Encrypting passwords with SHA1 in .NET and Java
    // http://authors.aspalliance.com/thycotic/articles/view.aspx?id=2 
    private static string getBase64Digest(string input)
    {
        SHA1 sha = new SHA1Managed();
        ASCIIEncoding ae = new ASCIIEncoding();
        byte[] data = ae.GetBytes(input);
        byte[] digest = sha.ComputeHash(data);
        return Convert.ToBase64String(digest);
    }

    // generate random nonce 
    private static string generateNonce()
    {
        Random random = new Random();
        int len = 24;
        string chars = "0123456789abcdef";
        string nonce = "";
        for (int i = 0; i < len; i++)
        {
            nonce += chars.Substring(Convert.ToInt32(Math.Floor(random.NextDouble() * chars.Length)), 1);
        }
        return nonce;
    }

    // Time stamp in UTC string 
    private static string generateTimestamp()
    {
        return DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
    }

    // C#-Base64 Encoding 
    // http://www.vbforums.com/showthread.php?t=287324 
    public static string base64Encode(string data)
    {
        byte[] encData_byte = new byte[data.Length];
        encData_byte = System.Text.Encoding.UTF8.GetBytes(data);
        string encodedData = Convert.ToBase64String(encData_byte);
        return encodedData;
    }

祝你好運! C。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM