我正在开发一个控制台应用程序,该应用程序在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;
}
答案 0 :(得分:0)
从命令行读取args时,如果值包含空格或特殊字符,请确保将值放在双引号中。