2014-02-25 71 views
0

我正在使用Omniture api來下載報告。當我用DataWarehouseCheckRequest方法檢查狀態時,報告就完成了。現在,當我嘗試使用DataWarehouseGetReportData方法來獲取報告,我得到在C#中調用'DataWarehouseGetReportData'時發生API異常

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兩者。不知道如何解決這個問題。請幫忙。

感謝

回答

0

當你要下載一個DW報告最好的選擇是做通過HTTP。這是標準方式,效率更高。

對CheckRequest的響應包含DataURL。用它來下載數據。我使用的是一個幾乎完全相同的API(合作伙伴vs你的企業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 = "abcdef"; 
     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.

+0

嗨@克里斯,我用這種方法,它的工作就像魅力。雖然我不確定這是如何比平常更加高效的SOAP請求,但是您能否對此有所瞭解? – pearl67

+0

Hi @ pearl67,它更高效,因爲它是基於製表符分隔的格式,非常簡單。 xml非常羅嗦,我們可以談論最多2GB大小的數據。所以你可以以製表符分隔的格式獲得更多的數據,然後使用xml。同樣在大xml格式中,您可能需要嘗試使用SAX解析器來管理內存需求,所以更多的複雜度恕我直言。祝你好運 –

+0

@ pearl67,因爲這對你有用,請你接受這個答案。 –

相關問題