【问题标题】:Two WCF services cannot interact when on same server两个 WCF 服务在同一台服务器上时无法交互
【发布时间】:2026-02-03 16:30:01
【问题描述】:

我有两个由托管服务提供商托管的 WCF 服务。两种服务都可以正常工作。我可以从我自己的计算机甚至是由其他提供商托管的网站访问它们。奇怪的部分(至少,我不明白的部分)是;一个人不能打电话给另一个人。

这两个服务都位于 Web 根目录的子文件夹中,处于相同的层级。像 wwwroot\serviceone 和 wwwroot\servicetwo。两者都被标记为 IIS 中的应用程序文件夹,两者都有一个几乎相似的 web.config,如下所示,只是名称不同:

<configuration>
     <system.web>
        <compilation targetFramework="4.0" />
      </system.web>
      <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="servone">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    <services>
      <service name="MyService.ServiceOne" behaviorConfiguration="servone">
        <endpoint address="" binding="basicHttpBinding" contract=" MyService.IServiceOne "/>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>

  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>
</configuration>

浏览 .svc 会显示带有示例代码的知名服务页面;

class Test
{
    static void Main()
    {
        ServiceOne client = new ServiceOne ();
        // Use the 'client' variable to call operations on the service.
        // Always close the client.
        client.Close();
    }
}

客户端有一个名为 HandleRequest(string str) 的方法。所以在我的代码(C#)中有这样一行;

client.HandleRequest("blah");

调用不会引发异常(我可以说是因为它们被捕获、处理并写入数据库)。这就像消息已发送但永远不会返回。 当我在本地运行此服务(谁调用另一个)并将第二个留在远程服务器上时,一切正常。

显然,很难提供主办方的所有详细信息。不幸的是,我也无法访问 IIS 安装来模拟环境。因此,基于我能提供的少量信息,我并不期待深入的技术解决方案。但任何关于此设置与其他设置有何不同的评论都可能会有所帮助。

非常感谢您的努力,谢谢。


编辑:

调用如下:

public bool Send(String str)
{
  bool result = false;
  BasicHttpBinding binding = new BasicHttpBinding();
  EndpointAddress ep = new EndpointAddress("http://www.mydomain.com/ServiceTwo.svc");
  client = new ServiceTwoClient(b, ep);
  //
  try
  {
    result = client.HandleRequest(str);
    client.Close();
    return result;
  }
  catch (Exception x)
  {
    Add2DbLog(x.Message);
    return false;
  }
}

【问题讨论】:

  • 你能展示一下服务#1调用服务#2的代码吗?
  • 开启message logging 可能会帮助您调试此问题。
  • @Keith - 感谢您的建议。我正在看它。唯一的问题是我不允许使用绝对路径。我更新了帖子以解决您的问题。
  • 我强烈建议将client.Close() 移动到finally 块中,以确保即使服务失败也关闭对象。否则,连接将保持打开状态,一段时间后,新连接将在打开时超时。
  • 是否有可能client.HandleRequest(str) 抛出异常但Add2DbLog 未能记录它?

标签: wcf c#-4.0


【解决方案1】:

您使用的域别名可能无法在服务器本地运行。登录到该服务器,启动 Web 浏览器,然后导航到代码中使用的服务 URL (http://www.mydomain.com/ServiceTwo.svc)。确保您没有收到任何错误消息。

【讨论】:

  • 那么,(域别名可能无法在本地工作)确实有可能吗?情况很可能就是这样。虽然很难检查,但我无法登录服务器(便宜的帐户,我知道)。另一方面,这是托管服务提供商应该能够回答的一个简单问题,对吧?我会问他们。我不知道他们是否会在周末回他们的票,所以可能需要几天时间。与此同时,我考虑将第二个服务集成到第一个服务中。无论如何,这应该可以解决这个(也许还有其他一些未知的)问题。非常感谢基思。
  • 有可能。由于一些有趣的网络配置,我曾经发生过一次。我不太熟悉网络,所以我不确定真正的原因是什么,或者网络级别的正确解决方案是什么。