WCF和IIS中的神秘问题?

4

你好
我写了一个WCF双工服务。在Visual Studio中,这个服务可以正常工作,但是当我将这个服务发布并放到IIS上时,服务不会回应任何客户端。
所有的客户端都能够正确连接到这个服务。他们也能够成功调用服务,并且没有发生任何异常。
唯一的区别是这些服务(IIS 服务和 VS 托管服务)的地址。例如:
* IIS 服务地址为http://localhost/SmsService/SmsService.svc 或者更好地说是虚拟路径地址。
* VS 托管服务地址为http://localhost:1408/SmsSrevice.svc。 我已经改变了客户端的服务器地址。

以下是服务/应用程序配置:
VS 托管服务

<system.serviceModel>
<services>
  <service name="SmsService.Business.SmsService"
           behaviorConfiguration="ServiceBehavior">
    <endpoint address="http://localhost:1408/SmsService.svc"
              binding="wsDualHttpBinding"
              contract="SmsService.Business.ISmsService">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

IIS托管服务

    <system.serviceModel>
<services>
  <service name="SmsService.Business.SmsService"
           behaviorConfiguration="ServiceBehavior">
    <endpoint address=""
              binding="wsDualHttpBinding"
              contract="SmsService.Business.ISmsService">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

客户端配置
  <system.serviceModel>
<bindings>
  <wsDualHttpBinding>
    <binding name="WSDualHttpBinding_SMSService"
             closeTimeout="00:10:00"
             clientBaseAddress="http://MyMachinName:10300/SmsClientService"
             openTimeout="00:01:00" 
             receiveTimeout="00:10:00" 
             sendTimeout="00:10:00"
             bypassProxyOnLocal="false" 
             transactionFlow="false" 
             hostNameComparisonMode="StrongWildcard"
             maxBufferPoolSize="524288" 
             maxReceivedMessageSize="65536"
             messageEncoding="Text" 
             textEncoding="utf-8" useDefaultWebProxy="true">
      <readerQuotas maxDepth="32"
                    maxStringContentLength="8192" 
                    maxArrayLength="16384"
                    maxBytesPerRead="4096" 
                    maxNameTableCharCount="16384" />
      <reliableSession ordered="true" inactivityTimeout="00:10:00" />
      <security mode="Message">
        <message clientCredentialType="Windows" 
                 negotiateServiceCredential="true"
                 algorithmSuite="Default" />
      </security>
    </binding>
  </wsDualHttpBinding>
</bindings>
<client>
  <endpoint address="http://SERVER1/SmsService/SmsService.svc" 
            binding="wsDualHttpBinding"
            bindingConfiguration="WSDualHttpBinding_SMSService" 
            contract="ServiceReference.SMSService"
            name="WSDualHttpBinding_SMSService">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
</client>

即使我在服务方法的开头写了事件日志,但那也不起作用!

那么问题出在哪里呢?

编辑1

首先感谢大家。

其次,我认为我没有清楚地解释我的问题。 "这个服务在Visual Studio中工作得很好"是指在VS中,我可以通过客户端(在VS中与服务相同的解决方案中)与服务器通信。客户端可以调用服务,服务也可以调用客户端,并且工作正常(任何计算、回调、数据库操作等)。

但是,当我将在VS中完全按照要求工作的服务发布到IIS中时,它并不能正常工作(即使在我的电脑上也是如此)。这意味着客户端可以创建服务对象并连接到托管在IIS上的服务,但是当客户端调用服务时,没有任何事件(计算、回调、数据库操作),而且服务也不会调用客户端

我不明白,如果我的代码中有任何错误的步骤,那么必须在VS中运行时发生。因此必须有一些我错过的东西,比如安全配置、客户端配置或其他东西


你能成功浏览到服务发现页面吗? - Paul Turner
为什么你的clientbaseaddress和endpoint address在不同的主机上? - leppie
@hero 是的,我可以看到服务。 @leppie 因为我的平台是网络,所以我在服务器系统上运行服务,并在我的机器上运行客户端。请看我的编辑。 - Rev
客户端是在本地局域网内的机器,即公司防火墙内,还是在互联网上的任何旧客户端?服务无法连接到哪个客户端位置? - Kev
我的计算机上托管了IIS服务,同时也是客户端。即使我在同一域中的其他计算机上运行客户端,结果仍然相同。 - Rev
3个回答

2
可能是防火墙阻止了 1408 端口。

@Bhaiji,你之前帮了我(再次感谢),但这不是同一个问题。请看我的编辑。 - Rev
您的客户端终端点为server1,但基地址不匹配,可以尝试更改它们。还要检查IIS日志以查看请求是否到达服务器。 - Shiraz Bhaiji
这是打印错误,实际上它们是相同的。如何检查IIS日志? - Rev
1
它们是文本文件,位置将取决于您的配置,在我的计算机上它们位于c:\inetpub\logfiles的子目录中。 - Shiraz Bhaiji

2
首先,Duplex是不好的(非常不好),但我不会在这里多说,因为你已经决定使用它。
我能看到的主要问题是安全性。我相信Windows事件日志会告诉你这一点——只需检查安全日志上的错误即可。默认情况下,IIS应用程序池不允许与其他计算机通信。你没有提到你是否已经特别做了任何事情,所以我假设它都是默认设置。只需将应用程序池的标识更改为管理员用户(尽管不建议在生产环境中这样做),我认为你会发现问题消失了——我只是猜测。
离题:为什么Duplex是不好的
- 服务器试图建立与客户端的连接,这严重降低了服务的可扩展性。实际上,如果客户端连接不好或者服务器连接超时,所有分配给该调用的资源都将被锁定,从而浪费。 - 客户端机器及其连接的规格可能会影响服务的性能。 - 对于服务器而言,通常确保其是可访问的。如果客户端在防火墙或NAT后面,则无法联系服务器。[这实际上可能是你的问题]。 - 因此,如果你为服务器打开客户端,这意味着客户端也可能暴露给整个世界。通常为服务器考虑安全性,但忽略了客户端,因此现在需要考虑很多事情。 - 还有更多的问题...但应该足够了。

1
为什么不好?Duplex的想法很棒。这意味着WCF-duplex不是一个好的工具吗? - Rev
此外,事件查看器中也没有安全日志。 - Rev
2
我已经添加了Duplex不好的原因。 - Aliostad
@Ali,你如何使用双向通信?我应该将wsDualHttpBinding更改为Tcp绑定吗? - Rev
双向通信不好,这就是我的观点 - 无论你使用什么绑定。大多数应用程序都是按照请求/响应范例设计的。现在只有在确实必须使用双向通信时才能使用它。尝试简化你的设计以适应请求-响应模型。 - Aliostad
显示剩余4条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接