从Windows应用程序访问IIS上托管的WCF服务时出现问题

时间:2009-08-31 19:49:25

标签: wcf

我使用wsHttpBinding创建了一个WCF服务,该服务使用asp.net成员资格提供程序进行身份验证。我能够成功地在服务器上托管服务。但是我的问题被打破了。 (我可以在浏览器中看到.svc和wsdl文件而不管域名)我只能从我的机器或同一域中的任何其他机器上使用该服务。如果我尝试通过应用程序从其他域访问该服务(Windows应用程序)。它给了我错误信息: -

“通信对象System.ServiceModel.Channels.ServiceChannel不能用于通信,因为它处于Faulted状态”

堆栈跟踪: 服务器堆栈跟踪:    在System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan timeout)

在[0]处重新抛出异常:    在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.ClientBase 1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) at System.ServiceModel.ClientBase 1.Close()    在System.ServiceModel.ClientBase`1.System.IDisposable.Dispose()    at AOLICWindows.Forms.SynchronizeTest.btnRegistration_Click(Object sender,EventArgs e)

1 个答案:

答案 0 :(得分:1)

wsHttpBinding默认使用Windows凭据进行身份验证,只要您位于同一个域或具有完全信任关系的域上,就可以了。

错误消息似乎指向超时 - 也许你需要调整那些。一旦在您的服务器上发生异常并且未正确处理并变成SOAP故障,则该通道(客户端和服务器之间的连接)是“故障的”,例如,它进入错误状态,不能再使用了。您所能做的只是中止频道(此时您甚至无法再关闭频道),并从头开始重新创建。

或者可能发生此超时是因为您已将客户端代理的使用情况包装到using(......) {......}块中?这通常是一个好主意 - 但不是在WCF客户端代理的情况下。

问题出现的原因是,一旦某个频道出现故障,您甚至无法再将其关闭。如果将客户端代理使用情况包装到using()语句中,当服务器上出现问题并且处理不当时,通道将出错,并且在using()块结束时,.NET运行时会尝试关闭它,然后抛出另一个异常因为通道出现故障....

因此,对于WCF客户端,推荐的最佳实践是这样的:

YourClientProxy proxy = new YourClientProxy();

try
{
   ... use it

   proxy.Close();
}
catch(TimeoutException exception)
{
   proxy.Abort();
}
catch(CommunicationException exception)
{
   proxy.Abort();
}

马克