【问题标题】:Application running in debugger connects to webservice in but not when running as windows service在调试器中运行的应用程序连接到 web 服务,但在作为 Windows 服务运行时不连接
【发布时间】:2012-02-02 00:28:18
【问题描述】:

我在 C# 中创建了一个应用程序,我将其作为 Windows 服务运行。这工作正常。

我最近对其进行了修改,使其连接到 Web 服务。在 Studio 中运行时,此新代码可以正常工作并连接到 Web 服务。但是,当我将程序作为 Windows 服务(在同一台机器上)运行时,程序超时,因为它无法连接到 Web 服务(出现异常 - 无法连接到远程服务器)。

谁能想到为什么会发生这种情况?

作为服务运行时看到的异常是:

System.Net.WebException was unhandled
Message="Unable to connect to the remote server"
Source="System"
StackTrace:
   at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
   at System.Net.HttpWebRequest.GetRequestStream()
   at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName,          Object[] parameters)
   at DataExtractionService.uk.co.myserver.Service1.SendEmail(String Message, String Subject, String FromAddress, String[] ToAddress, String[] AttachmentNames, Object[] AttachmentData) in C:\Documents and Settings\administrator.MLR\My Documents\Visual Studio 2005\Projects\DataExtractionService\DataExtractionService\Web References\uk.co.myserver\Reference.cs:line 111
   at DataExtractionService.APDataExtractor.EmailReport(String message, String subject) in C:\Documents and Settings\administrator.MLR\My Documents\Visual Studio 2005\Projects\DataExtractionService\DataExtractionService\APDataExtractor.cs:line 610
   at DataExtractionService.APDataExtractor.RunDataExtraction() in C:\Documents and Settings\administrator.MLR\My Documents\Visual Studio 2005\Projects\DataExtractionService\DataExtractionService\APDataExtractor.cs:line 63
   at DataExtractionService.DataExtractionService.HandleClientComm(Object client) in C:\Documents and Settings\administrator.MLR\My Documents\Visual Studio 2005\Projects\DataExtractionService\DataExtractionService\DataExtractionService.cs:line 96
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart(Object obj)

Web 服务只是在“Web 引用”下以正常方式添加到项目中。 Web 服务在 Studio 中正常工作。

exe.config 的相关部分如下所示(我不得不更改服务器的名称,抱歉):

<applicationSettings>
<DataExtractionService.Properties.Settings>
  <setting name="DataExtractionService_uk_co_myserver_Service1"
    serializeAs="String">
    <value>https://myserver.co.uk/premieremailservice/Service1.asmx</value>
  </setting>
</DataExtractionService.Properties.Settings>
 </applicationSettings>

非常感谢。

【问题讨论】:

  • 服务以哪个用户帐户(查看服务的登录选项卡)运行?
  • 嗨,它正在作为本地系统帐户运行。
  • 您能否发布更多详细信息,也许是一些连接代码和异常信息?
  • 您可以在您的 PC 上安装 Fiddler。它可能会提供更详细的错误信息。 fiddler2.com/fiddler2
  • 您说它在您调试时工作 - 是托管在 IIS 中的 Web 服务还是 Web 开发服务器(Web 服务可能在奇怪的端口上运行,例如 8827)。如果是这样,你是不是在启动windows服务之前没有运行web服务?

标签: c# .net windows-services


【解决方案1】:

Web 服务在哪里运行?它需要什么类型的身份验证(如果有)?如果您的 Windows 服务在本地帐户(例如系统或网络服务)下运行,则它可能没有必要的权限来连接到远程设备。

如果是这种情况,那么您需要在域帐户下执行 windows 服务并授予该帐户与 Web 服务通信的权限,或者完全删除身份验证。

当您在 Visual Studio 中执行代码时,您是在自己的凭据上下文中运行的,我认为这足以访问 Web 服务。

【讨论】:

  • 这个想法的唯一问题是,如果这是一个身份验证错误,您通常会收到 HTTP 403 - Forbidden,而不是“无法连接”错误。
  • 在系统下运行可能是问题所在。网络服务应该允许出站网络连接。
  • @CodingGorilla 对于通过 TCP 传输的连接也是如此吗?我在堆栈跟踪中看到HttpWebRequest,但我不确定这是否一定意味着传输机制。
  • 大家好 - 非常感谢大家的建议。我最终通过将服务帐户从“本地系统”切换到域管理员帐户来使其正常工作。
  • @kprobst 不,这对于纯 TCP 传输连接不适用,但 Web 服务通常不使用纯 TCP(因此称为“Web 服务”)并且基于堆栈跟踪和包含 HttpWebRequest 类我认为可以肯定地说这确实是一个 HTTP 连接。
猜你喜欢
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 2012-01-30
  • 2012-02-10
  • 2022-11-24
相关资源
最近更新 更多