从Azure获取C#中的XML文件作为响应

时间:2012-11-29 10:18:54

标签: c# xml windows-phone-7 azure reporting-services

我们在Azure上有一个RDL和XML文件。我有一个fullURI到loginId和密码(Azure)的路径,它可以直接下载一个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 azure登录页面(包含我们发送的信息)。下面是响应,这里我用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. 我们是否应该根据您在问题描述的前四行中可以理解的内容来查找服务器端以更正直接XML文件的URL?

  5. 先谢谢,

    Trilok Rangan。

1 个答案:

答案 0 :(得分:1)

在遇到异常时,可能会因为遇到服务器上的通用错误处理页面而导致返回html。

因此,请确保在所有情况下都返回xml,即使出现异常。

该异常可能是由安全问题或服务器上的任何其他错误引起的。

确保服务器设置的内容类型正确无误。

如果文件存储在blob-storage中: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>