Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Windows应用程序访问IIS上承载的WCF服务时出现问题_Wcf - Fatal编程技术网

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

从Windows应用程序访问IIS上承载的WCF服务时出现问题,wcf,Wcf,我使用wsHttpBinding创建了一个WCF服务,该服务使用asp.net成员资格提供程序进行身份验证。我可以成功地在服务器上托管服务。但我的问题已经解决了。(我可以在浏览器中看到.svc和wsdl文件,而不考虑域)我只能从我的机器或同一域中的任何其他机器使用服务。如果我试图通过应用程序(windows appl.)从其他域访问服务。它给了我错误信息:- 通信对象System.ServiceModel.Channels.ServiceChannel无法用于通信,因为它处于故障状态 堆栈跟踪:

我使用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
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();
}

Marc

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();
}

马克

谢谢你,非常感谢马克。这有助于我找出实际问题。谢谢你,马克。这有助于我找出实际问题。