控制台 Web 服务应用程序在编译时不工作,但在 Visual Studio 中工作
Console Web Service App Doesn't Work When Compiled, but works in Visual Studio
我正在开发一个控制台应用程序,该应用程序在 SQL 2008 R2 SSRS 服务器上使用 Reporting Services 执行网络服务 (ReportExeuction2005.asmx)。目的是让它 运行 一份报告并将报告输出保存到 CSV 文件。报表服务器位于远程位置,可通过 HTTPS 通过 Web 进行访问。我已经编写了应用程序,当我在 Visual Studio 2013 年通过调试器 运行 它时,它按预期工作。但是,如果我尝试 运行 项目 BIN 文件夹中已编译的 .EXE,Web 服务调用将失败并抛出错误 "The request failed with HTTP status 401: Unauthorized"。我在调试器中和通过编译的 .EXE 传递相同的凭据,但它们各自导致不同的错误。
当我通过两者发出请求时,我也 运行 Fiddler。看来,当我 运行 调试器发送请求时,每个请求两次,第一次失败,然后第二次请求成功。然后,当我通过编译的应用程序执行相同的调用时,它在第一次尝试时失败并抛出异常并退出。在对此进行研究时,我发现调试器中的行为是正确的行为,因为它正在 Kerbose 和 NTLM 身份验证之间进行协商。我不确定为什么调试器的行为与编译的 .EXE 行为不同。我试图强制 Web 服务调用通过 CredentialCache 使用 NTLM 身份验证,但是当我将 CredentialCache 与 SSRS Web 服务一起使用时,它根本不起作用。
有没有办法强制编译后的应用执行与调试器相同的身份验证?
这是我目前的代码:
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;
}
从命令行读取参数时,如果值包含空格或特殊字符,请确保将它们放在双引号中。
我正在开发一个控制台应用程序,该应用程序在 SQL 2008 R2 SSRS 服务器上使用 Reporting Services 执行网络服务 (ReportExeuction2005.asmx)。目的是让它 运行 一份报告并将报告输出保存到 CSV 文件。报表服务器位于远程位置,可通过 HTTPS 通过 Web 进行访问。我已经编写了应用程序,当我在 Visual Studio 2013 年通过调试器 运行 它时,它按预期工作。但是,如果我尝试 运行 项目 BIN 文件夹中已编译的 .EXE,Web 服务调用将失败并抛出错误 "The request failed with HTTP status 401: Unauthorized"。我在调试器中和通过编译的 .EXE 传递相同的凭据,但它们各自导致不同的错误。
当我通过两者发出请求时,我也 运行 Fiddler。看来,当我 运行 调试器发送请求时,每个请求两次,第一次失败,然后第二次请求成功。然后,当我通过编译的应用程序执行相同的调用时,它在第一次尝试时失败并抛出异常并退出。在对此进行研究时,我发现调试器中的行为是正确的行为,因为它正在 Kerbose 和 NTLM 身份验证之间进行协商。我不确定为什么调试器的行为与编译的 .EXE 行为不同。我试图强制 Web 服务调用通过 CredentialCache 使用 NTLM 身份验证,但是当我将 CredentialCache 与 SSRS Web 服务一起使用时,它根本不起作用。
有没有办法强制编译后的应用执行与调试器相同的身份验证?
这是我目前的代码:
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;
}
从命令行读取参数时,如果值包含空格或特殊字符,请确保将它们放在双引号中。