控制台Web服务应用程序在编译时不起作用,但在Visual Studio中有效

时间:2015-02-18 15:40:24

标签: c# web-services reporting-services visual-studio-2013 console

我正在开发一个控制台应用程序,该应用程序在SQL 2008 R2 SSRS服务器上使用Reporting Services执行Web服务(ReportExeuction2005.asmx)。目的是让它运行报告并将报告输出保存到CSV文件。报表服务器位于远程位置,可通过Web通过HTTPS访问。我编写了应用程序,当我通过Visual Studio 2013中的调试器运行它时,它按预期工作。但是,如果我尝试在项目的BIN文件夹中运行已编译的.EXE,则Web服务调用将失败并引发错误"请求失败,HTTP状态为401:未授权"。我在调试器和编译的.EXE中传递相同的凭据,但它们每个都会导致不同的错误。

当我通过两者发出请求时,我也运行了Fiddler。看来,当我运行调试器时,每次请求发送请求两次,第一次失败,然后第二次请求成功。然后当我通过编译的应用程序执行相同的调用时,它在第一次尝试时失败并抛出异常并退出。在研究这个时,我发现调试器中的行为是正确的行为,因为它在Kerbose和NTLM身份验证之间进行协商。我不知道为什么调试器行为与编译的.EXE行为不同。我试图强制Web服务调用通过CredentialCache使用NTLM身份验证,但是当我使用带有SSRS Web服务的CredentialCache时,它根本不起作用。

有没有办法强制已编译的应用程序执行与调试器相同的身份验证?

这是我到目前为止的代码:

        System.Net.ServicePointManager.Expect100Continue = false;
        //args = App.exe ReportName UserName Password Domain ExportedFileNameAndPath

        ReportExecutionService rse = new ReportExecutionService();

        rse.Url = "https://SomeWebServiceURL/ReportExecution2005.asmx";

        rse.Credentials = new System.Net.NetworkCredential(args[1], args[2], args[3]);

        string historyID = null;
        string deviceInfo = null;
        string format = "CSV";
        Byte[] results;
        string encoding = String.Empty;
        string mimeType = String.Empty;
        string extension = String.Empty;
        ConsoleApplication2.webservice.Warning[] warnings = null;
        string[] streamIDs = null;


        string fileName = args[4];
        string _reportName = args[0];

        try
        {
            rse.ExecutionHeaderValue = new ExecutionHeader();

            ExecutionInfo ei = rse.LoadReport(_reportName, historyID);

            results = rse.Render(format, deviceInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);

            using (FileStream stream = File.OpenWrite(fileName))
            {
                stream.Write(results, 0, results.Length);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }

1 个答案:

答案 0 :(得分:0)

从命令行读取args时,如果值包含空格或特殊字符,请确保将值放在双引号中。