首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从sql报表服务器下载XML文件

从sql报表服务器下载XML文件
EN

Stack Overflow用户
提问于 2012-12-13 06:37:59
回答 2查看 2K关注 0票数 4

我正在尝试从下载一个xml文件,该服务器需要身份验证才能获得该文件。我正在尝试以下两种方法:

方法1

在这种方法中,我尝试在c#控制台应用程序下面下载文件。很好用!

代码语言:javascript
复制
void DownloadFile(string uname, string password)
{
        ServerReport report = new ServerReport();
        report.ReportServerUrl = new System.Uri("https://xxxxx.reporting.windows.net/ReportServer", System.UriKind.Absolute);
        report.ReportPath = "/Demo2.rdl";
        report.ReportServerCredentials.SetFormsCredentials(null, uname, password, "xxxxx.reporting.windows.net");
        byte[] data = report.Render("XML");
        FileStream fs = new FileStream(@"c:\output.xml", FileMode.Create);
        fs.Write(data, 0, data.Length);
        fs.Close();
}

方法2

现在,我想从windows应用程序下载相同的文件。现在,由于ServerReport不在windows中,所以我在WebClient中下载该文件。因此,我正在尝试下面的代码,但它似乎不起作用:

代码语言:javascript
复制
void DownloadFile(string uname, string password)
{
    WebClient webClient = new WebClient();
    webClient.Credentials = new NetworkCredential(uname, password, "xxxxx.reporting.windows.net");    
    webClient.DownloadFile("https://xxxxx.reporting.windows.net/ReportServer?%2fDemo2.rdl&rs:Command=Render&rs:Format=XML", @"c:\output.xml");
}

下面是方法2的输出:看起来它是重新定向到登录页面吗?

代码语言:javascript
复制
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >


    <html lang="en-US">
       <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>
        Windows Azure SQL Reporting
    </title></head>
       <body >
          <form name="Logon" method="post" action="logon.aspx?ReturnUrl=%2fReportServer%3f%252fDemo2.rdl%26rs%3aCommand%3dRender%26rs%3aFormat%3dXML&amp;%2fDemo2.rdl&amp;rs%3aCommand=Render&amp;rs%3aFormat=XML" id="Logon">
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/XXXX" />

    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/YYYY" />

            <h1 id="Title"><span id="LblTitleContent">Windows Azure</span></h1>
            <hr />
            <div class="ClsIntro">
                <span id="LblIntro"></span>
            </div>
            <div class="ClsInput">
                <div>
                    <label for="TxtUser" id="LblUser">User name</label>
                </div>
                <div>
                    <input name="TxtUser" type="text" id="TxtUser" tabindex="1" />
                </div>
            </div>
            <div class="ClsInput">
                <div>
                    <label for="TxtPwd" id="LblPwd">Password</label>
                </div>
                <div>
                    <input name="TxtPwd" type="password" id="TxtPwd" tabindex="2" />
                </div>
            </div>
            <div class="ClsSignIn">
                <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" />
            </div>
            <div class="ClsErrMsg">
                <span id="lblMessage"></span>
            </div>
            <hr />
          </form>
       </body>
    </html>

方法2有什么问题,我们有遗漏什么吗?

更新

我对这种蔚蓝和网络服务非常陌生。我可能在问一些愚蠢的问题。以下是我尝试过的:

  • 我尝试在我的windows 7项目中添加一个“服务引用”来访问sql报表服务器。我注意到的一件事是,我不能将serice添加为"Web引用“,因为它在windows 7应用程序中是禁用的。
  • 在我的应用程序中添加了serive之后,我得到了一系列的类。其中之一是ReportExecutionServiceSoapClient;
  • ReportExecutionService不可用。
  • 我不太确定如何使用ReportExecutionServiceSoapClient api来获得可以用于WebClient的cookie。
  • 任何关于如何使用这些API的示例应用程序都是很棒的。我试着在网上搜索,但是找不到更多的信息。
  • 下面是我尝试过的内容,但cookie计数为空。 ReportExecutionServiceSoapClient client =新ReportExecutionServiceSoapClient();MainPage_Loaded(对象发送方,RoutedEventArgs e) { client.ClientCredentials.UserName.UserName = "XXXX";client.ClientCredentials.UserName.Password = "XXXX“;client.CookieContainer =新CookieContainer();client.LogonUserCompleted += new CookieContainer client.LogonUserAsync("XXXX”、“XXXX”、"xxxx.reporting.windows.net");} void client_LogonUserCompleted(对象发送方,System.ComponentModel.AsyncCompletedEventArgs e) { int count = client.CookieContainer.Count;// NULL COOKIE计数!}

下面是ClientConfig文件。我添加了enableHttpCookieContainer=“真”。

代码语言:javascript
复制
    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="ReportExecutionServiceSoap" maxBufferSize="2147483647"
                        enableHttpCookieContainer="true"
                             maxReceivedMessageSize="2147483647">
                        <security mode="Transport" />
                    </binding>
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="https://xxxx.reporting.windows.net:443/ReportServer/ReportExecution2005.asmx"
                    binding="basicHttpBinding" bindingConfiguration="ReportExecutionServiceSoap"
                    contract="SqlReportingService.ReportExecutionServiceSoap"
                    name="ReportExecutionServiceSoap" />
            </client>
        </system.serviceModel>
    </configuration>
  • 请告诉我少了什么。

解决了问题--最后我可以从下载文件。-以下是解决办法。-首先向Sql报表服务器添加服务引用。-那就做一个ReportExecutionServiceSoapClient::LogonUserAsync.-将获得的cookie与WebClient一起用于进一步的请求。

代码语言:javascript
复制
     public class WebClientExtended : WebClient
            {
                private CookieContainer myContainer;
                private HttpWebRequest myRequest;
                [SecuritySafeCritical]
                public WebClientExtended()
                {
                }

                [SecuritySafeCritical]
                public WebClientExtended(CookieContainer containter) 
                { 
                    myContainer = containter; 
                }

                public CookieContainer Cookies
                {
                    get { return myContainer; }
                    set { myContainer = value; }
                }

                protected override WebRequest GetWebRequest(Uri address)
                {
                    myRequest = (HttpWebRequest)base.GetWebRequest(address);
                    myRequest.Method = "GET";
                    myRequest.CookieContainer = Cookies;
                    return myRequest;
                }

                protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result)
                {
                    return myRequest.EndGetResponse(result);
                }
            }

            ReportExecutionServiceSoapClient rs = new ReportExecutionServiceSoapClient();
            string servername = "XXXX.reporting.windows.net";
            string uname = "XXXX";
            string password = "XXXX";

            public void LoadReport()
            {
                rs.ClientCredentials.UserName.UserName = uname;
                rs.ClientCredentials.UserName.Password = password;
                rs.CookieContainer = new CookieContainer();
                rs.LogonUserCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(rs_LogonUserCompleted);
                rs.LogonUserAsync(uname, password, servername);

            }

            void rs_LogonUserCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
            {
                WebClientExtended webClient = new WebClientExtended(rs.CookieContainer);
                webClient.Credentials = new NetworkCredential(uname, password, servername);
                webClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webClient_DownloadStringCompleted);
                webClient.DownloadStringAsync(new Uri(String.Format("https://{0}/ReportServer?%2fDemo2.rdl&rs:Command=Render&rs:Format=XML", servername)));
            }

            void webClient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
            {
                 MessageBox.Show(e.Result);
            }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-13 09:23:15

ServerReport类将调用ReportExecutionService上的LogonUser方法,以获得表单身份验证cookie,该cookie将用于所有其他请求(如呈现到ReportExecutionService)。

在您的WebClient应用程序中使用WP7凭据并不包括这一点。你有两个选择:

  • 尝试通过调用LogonUser获得cookie并在WebClient中使用它
  • 不要使用WebClient,而是通过ReportExecutionService呈现报表

看看Windows报告:使用SOAP博客文章,就可以在SQL中开始这项服务了。

票数 0
EN

Stack Overflow用户

发布于 2012-12-14 12:23:37

In approach Update: --您可能实际上已经收到了cookies,即使代码说它们不存在。因为“安全问题”,这些只是隐藏在CookieContainer内部的某个地方。

只需尝试将相同的CookieContainer实例插入到下一个WebRequest,并尝试它是否进行身份验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13854356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档