WCF和IIS中的神秘问题?

时间:2010-11-24 09:07:30

标签: c# wcf

您好
我写了WCF duplex service。此服务在Visual Studio中运行良好,但是当我发布此服务并将其放在IIS上时Service don't answer to any Client 所有客户端都正确连接到此服务。他们也称服务井,没有例外 这些服务(IIS服务和VS托管服务)之间只有不同之处。例如:
* IIS服务地址为http://localhost/SmsService/SmsService.svc或更好的说是虚拟路径地址 * VS托管服务地址为http://localhost:1408/SmsSrevice.svc。 绝对I changed Server address for client's.

此处服务/应用程序配置:
 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(即使在我自己的计算机中)。这意味着Client can create service object and connect to that IIS Hosted Service,但是当客户端的呼叫服务没有事件(计算,回调,数据库操作)和Service also don't call Client's时。

我不明白,如果我的代码中的任何步骤出现错误,那么必须在VS中的运行时发生。所以必须是我错过的security config, client side config or something else

3 个答案:

答案 0 :(得分:2)

可能是阻止端口1408的防火墙

答案 1 :(得分:2)

首先,Duplex很糟糕(真的很糟糕),但是由于你决定使用它,我不会喋喋不休。

我能看到的主要问题是安全性。我确信windows eventlog会告诉你这个故事 - 只需检查安全日志中的错误。默认情况下,不允许IIS应用程序池与其他计算机通信。你没有提到你已经专门做了任何事情,所以我认为它都是默认的。只需将应用程序池的标识更改为管理员用户(我认为不建议用于生产),我认为您会看到问题消失 - 我只是猜测。


OFF-TOPIC:为什么DUPLEX不好

  • 当服务器尝试建立与客户端的连接时,会大大降低服务的可伸缩性。实际上,如果客户端连接不良或者......服务器的连接可能会挂起,直到它在这段时间内超时,专用于该呼叫的所有资源都将被锁定,从而浪费。
  • 客户端计算机及其连接的规范可能会影响服务的性能。
  • 对于服务器,通常会确保它是可访问的。如果客户端位于防火墙或NAT后面,则无法联系服务器。 [这可能是您的问题]。
  • 因此,如果您打开服务器的客户端,则意味着客户端也可能会暴露给整个世界。服务器的安全考虑通常是好的,但客户端被忽略,因此现在需要考虑很多事情。
  • 还有更多......但这应该足够了。

答案 2 :(得分:0)

您可以在浏览器中打开http://localhost:1408/SmsSrevice.svc吗?如果没有,请检查您的IIS配置。 http://msdn.microsoft.com/en-us/library/ms733766.aspx