从Windows应用程序访问IIS上承载的WCF服务时出现问题
我使用wsHttpBinding创建了一个WCF服务,该服务使用asp.net成员资格提供程序进行身份验证。我可以成功地在服务器上托管服务。但我的问题已经解决了。(我可以在浏览器中看到.svc和wsdl文件,而不考虑域)我只能从我的机器或同一域中的任何其他机器使用服务。如果我试图通过应用程序(windows appl.)从其他域访问服务。它给了我错误信息:- 通信对象System.ServiceModel.Channels.ServiceChannel无法用于通信,因为它处于故障状态 堆栈跟踪: 服务器堆栈跟踪: 在System.ServiceModel.Channels.CommunicationObject.Close处(TimeSpan超时) 在[0]处重试异常: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) at System.Runtime.Remoting.proxy.RealProxy.PrivateInvoke(MessageData&msgData,Int32类型) 位于System.ServiceModel.ICommunicationObject.Close(TimeSpan超时) 位于System.ServiceModel.ClientBase从Windows应用程序访问IIS上承载的WCF服务时出现问题,wcf,Wcf,我使用wsHttpBinding创建了一个WCF服务,该服务使用asp.net成员资格提供程序进行身份验证。我可以成功地在服务器上托管服务。但我的问题已经解决了。(我可以在浏览器中看到.svc和wsdl文件,而不考虑域)我只能从我的机器或同一域中的任何其他机器使用服务。如果我试图通过应用程序(windows appl.)从其他域访问服务。它给了我错误信息:- 通信对象System.ServiceModel.Channels.ServiceChannel无法用于通信,因为它处于故障状态 堆栈跟踪:
1.System.ServiceModel.ICommunicationObject.Close(TimeSpan超时)
在System.ServiceModel.ClientBase上
1.Close()
位于System.ServiceModel.ClientBase`1.System.IDisposable.Dispose()
在AOLICWindows.Forms.SynchronizeTest.btnRegistration\u单击(对象发送方,事件参数e)wsHttpBinding默认使用Windows凭据进行身份验证,只要您在同一个域上或在具有完全信任关系的域上,就可以了 错误消息似乎指向超时-也许您需要调整它们。一旦服务器上发生异常,且该异常未得到正确处理并转化为SOAP故障,则通道(客户端和服务器之间的连接)将出现“故障”,例如,它将进入错误状态,无法再使用。您所能做的就是中止通道(此时您甚至无法再关闭它),然后从头开始重新创建它 或者,发生此超时可能是因为您使用(……{……}块将客户端代理的用法包装到了
中?这通常是一个好主意——但对于WCF客户机代理来说不是这样
出现此问题的原因是,一旦通道出现故障,您甚至无法再关闭它。如果将客户端代理使用情况包装到using()语句中,当服务器出现问题且未正确处理时,通道将出现故障,并且在using()块结束时,.NET运行时将尝试关闭它,然后由于通道出现故障而引发另一个异常
因此,对于WCF客户端,建议的最佳实践如下:
YourClientProxy proxy = new YourClientProxy();
try
{
... use it
proxy.Close();
}
catch(TimeoutException exception)
{
proxy.Abort();
}
catch(CommunicationException exception)
{
proxy.Abort();
}
MarcwsHttpBinding默认使用Windows凭据进行身份验证,只要您位于同一域或具有完全信任关系的域上,就可以进行身份验证
错误消息似乎指向超时-也许您需要调整它们。一旦服务器上发生异常,且该异常未得到正确处理并转化为SOAP故障,则通道(客户端和服务器之间的连接)将出现“故障”,例如,它将进入错误状态,无法再使用。您所能做的就是中止通道(此时您甚至无法再关闭它),然后从头开始重新创建它
或者,发生此超时可能是因为您使用(……{……}
块将客户端代理的用法包装到了中?这通常是一个好主意——但对于WCF客户机代理来说不是这样
出现此问题的原因是,一旦通道出现故障,您甚至无法再关闭它。如果将客户端代理使用情况包装到using()语句中,当服务器出现问题且未正确处理时,通道将出现故障,并且在using()块结束时,.NET运行时将尝试关闭它,然后由于通道出现故障而引发另一个异常
因此,对于WCF客户端,建议的最佳实践如下:
YourClientProxy proxy = new YourClientProxy();
try
{
... use it
proxy.Close();
}
catch(TimeoutException exception)
{
proxy.Abort();
}
catch(CommunicationException exception)
{
proxy.Abort();
}
马克谢谢你,非常感谢马克。这有助于我找出实际问题。谢谢你,马克。这有助于我找出实际问题。