在IIS中托管WCF服务时如何避免CommunicationObjectFaultedException?

时间:2009-07-29 20:49:39

标签: .net asp.net wcf iis

创建WCF Web Service for IIS并在我的ASP.NET开发服务器中成功测试后,当我将服务部署到另一台机器的 IIS时,它总是会在消耗时触发以下异常:

  

测试方法PoolingServiceTest.ProgramTest.MainTaskTest抛出异常:System.ServiceModel.CommunicationObjectFaultedException:O objetodecomunicação,System.ServiceModel.Channels.ServiceChannel,nãopodeser usadoparacomunicaçãoporqueestánoestado Com Falha ..

英文:该对象不能用于通信,因为它有故障(故障)

堆栈跟踪

  

System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout)   System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)   System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 type)   System.ServiceModel.ICommunicationObject.Close(TimeSpan超时)   System.ServiceModel.ICommunicationObject.Close(TimeSpan超时)   关()   System.IDisposable.Dispose()

我该怎么做才能避免这种情况?

使用围绕客户端代码的try catch块,我得到了一个不同的例外:

  

[System.ServiceModel.Security.SecurityNegotiationException] {“Ochamadornãofoiautenticadopelservorviço。”} System.ServiceModel.Security.SecurityNegotiationException

英文:呼叫者未通过服务验证

1 个答案:

答案 0 :(得分:3)

很明显,从第二条消息开始,服务期望调用者进行身份验证。根据您使用的绑定(协议),这可能是以下几种方法之一:

  • Windows身份验证:默认情况下为wsHttp和netTcp绑定启用 - 将使用用户的Windows帐户(这要求主叫用户和被叫服务位于同一Windows域,或至少在受信任的域中)

  • 针对ASP.NET成员身份的用户名/密码身份验证 - 这通常需要相当多的配置,因此我认为您不会“默认启用”

  • X.509证书 - 再次需要配置

我的猜测是:您的网络IIS服务器以某种方式无法正确理解/解释调用方的身份。该IIS服务器可能不是Active Directory域的成员吗?或者呼叫者的计算机不是同一个域的成员?我认为它必须是那个领域的东西。

马克

<强> PS:
要一起关闭安全性(不推荐! - 至少不适用于真实的生产系统),您可以这样做:

<bindings>
  <basicHttpBinding>
    <binding name="NoSecurity">
      <security mode="None" />
    </binding>
  </basicHttpBinding>

然后引用端点(服务器端和客户端)的绑定配置:

<endpoint address="....." 
          binding="basicHttpBinding" 
          bindingConfiguration="NoSecurity"
          contract="IMyService" />