2012-11-29 27 views
3

Azure上有一個RDL和XML文件。我有一個fullURI到loginId和密碼(Azure)的路徑,它可以直接下載一個xml文件。從Azure獲取C#中的XML文件作爲響應

在瀏覽器中,此鏈接(fullURI)將爲 1.打開Azure登錄頁面。 2.在輸入憑證時,會打開一個對話框,詢問您是否要打開/保存/取消xml文件? 3.如果我們選擇Open,它會在瀏覽器中打開XML文件。

在使用C#代碼的WP7應用程序中,我們試圖從上面訪問xml。代碼片段如下所示。

protected class GetContext 
{ 
    public HttpWebRequest Request; 
} 

請求

HttpWebRequest xmlReportRequest; 

… …. 
// baseuri is a HTTPS link to azure reporting server. 
URI fullUri = new Uri(baseuri + "&rs:Command=Render&rs:Format=XML"); 
xmlReportRequest = (HttpWebRequest)HttpWebRequest.Create(fullUri.Uri); 
xmlReportRequest.Credentials = new NetworkCredential(UserName, Password); 

// start the asynchronous request 
xmlReportRequest.BeginGetResponse(new AsyncCallback(HandleResponse), new GetContext { Request = request }); 

); 

響應

private void HandleResponse(IAsyncResult asyncResult) 
{ 
    var context = (GetFContext)result.AsyncState; 
    WebResponse response = context.Request.EndGetResponse(asyncResult); 

    //get the stream containing the response from the async call 
    Stream streamResult; 
    streamResult = response.GetResponseStream(); 

    // load the XML 
    _xmlDocument = XElement.Load(streamResult); // EXCEPTION AT THIS LINE NOTSUPPORTEDEXCEPTION 

    …. …   … 

} 

這裏的GetResponseStream的輸出不是XML文件。當流存儲到字符串中時,我們可以看到它是作爲HTML的Azure登錄頁面。

響應已從的GetResponseStream我覺得只是一個HTML蔚藍的登錄頁面(與我們發送的信息)。以下是迴應,我在這裏已經換成URL_TO_THE_XML_FILE_IN_REPORTING_SERVER一些機密信息(這基本上是目標URI),SOME_ENCRYPTED_VALUE。

\r\n<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" >\r\n\r\n\r\n<html lang=\"en-US\">\r\n <head id=\"Head1\"><meta http-equiv=\"Content-Type\" content=\"text/html;charset=ISO-8859-1\" /><link rel=\"Stylesheet\" type=\"text/css\" href=\"Public/Logon.css\" /><title>\r\n\tWindows Azure SQL Reporting\r\n</title></head>\r\n <body >\r\n  <form name=\"Logon\" method=\"post\" action=\"logon.aspx?ReturnUrl=URL_TO_THE_XML_FILE_IN_REPORTING_SERVER\" id=\"Logon\">\r\n<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=\"/SOME_ENCRYPTED_VALUE\" />\r\n\r\n<input type=\"hidden\" name=\"__EVENTVALIDATION\" id=\"__EVENTVALIDATION\" value=\"/SOME_ENCRYPTED_VALUE\" />\r\n\r\n  <h1 id=\"Title\"><span id=\"LblTitleContent\">Windows Azure</span></h1>\r\n  <hr />\r\n  <div class=\"ClsIntro\">\r\n   <span id=\"LblIntro\"></span>\r\n  </div>\r\n  <div class=\"ClsInput\">\r\n   <div>\r\n    <label for=\"TxtUser\" id=\"LblUser\">User name</label>\r\n   </div>\r\n   <div>\r\n    <input name=\"TxtUser\" type=\"text\" id=\"TxtUser\" tabindex=\"1\" />\r\n   </div>\r\n  </div>\r\n  <div class=\"ClsInput\">\r\n   <div>\r\n    <label for=\"TxtPwd\" id=\"LblPwd\">Password</label>\r\n   </div>\r\n   <div>\r\n    <input name=\"TxtPwd\" type=\"password\" id=\"TxtPwd\" tabindex=\"2\" />\r\n   </div>\r\n  </div>\r\n  <div class=\"ClsSignIn\">\r\n   <input type=\"submit\" name=\"BtnLogon\" value=\"Sign in\" id=\"BtnLogon\" tabindex=\"4\" /><input type=\"image\" name=\"BtnLogonArrow\" id=\"BtnLogonArrow\" tabindex=\"5\" src=\"Public/WhiteRightArrow.png\" alt=\"Sign in\" align=\"baseline\" border=\"0\" />\r\n  </div>\r\n  <div class=\"ClsErrMsg\">\r\n   <span id=\"lblMessage\"></span>\r\n  </div>\r\n  <hr />\r\n  </form>\r\n </body>\r\n</html> 

問題

  1. 即使網絡憑據傳遞我們爲什麼越來越登錄頁面一個HTML的響應?

  2. 什麼可能會導致此行中的異常? - _xmlDocument = XElement.Load(streamResult)

  3. 我們是否錯過了我們從C#代碼訪問Azure託管的XML的方式?

  4. 我們是否應該寧可看在服務器端進行修正URL根據您可以從第一個四行我們的問題描述的理解直接XML文件?

由於事先

三輪式液力蘭根。

+0

你是如何創建的XML文件? NotSupportedException通常表示XML文件有問題。 –

+0

我們得到一個HTML文件作爲響應,而不是一個XML文件因此,我相信NotSupportedException。 – LogRCubed

+0

如何返回XML文件?請顯示一些服務器端代碼 –

回答

1

獲取HTML回可能被遇到異常,當運行到服務器上的一般錯誤處理頁面引起的。

所以一定要確保你在任何情況下返回XML,即使在異常情況下。

該異常可能是由安全問題或服務器上的任何其他錯誤引起的。

確保服務器設置的內容類型正確。

如果文件被存儲在BLOB存儲:mark the file's mime type in the blob storage explorer

如果該文件是靜態內容:add the mime type in the web.config using the mimeMap element

<configuration> 

    <system.webServer> 

     <staticContent> 
      <mimeMap fileExtension=".mp4" mimeType="video/mp4" /> 
      <mimeMap fileExtension=".m4v" mimeType="video/m4v" /> 
     </staticContent> 

    </system.webServer> 

</configuration>