从 Windows 应用程序访问托管在 IIS 上的 WCF 服务时出现问题
Posted
技术标签:
【中文标题】从 Windows 应用程序访问托管在 IIS 上的 WCF 服务时出现问题【英文标题】:Problem with accessing WCF service hosted on IIS from a Windows application 【发布时间】:2010-11-24 10:50:38 【问题描述】:我使用 wsHttpBinding 创建了一个 WCF 服务,该服务使用 asp.net 成员资格提供程序进行身份验证。我可以成功地在服务器上托管服务。但我的问题是wiered。 (无论域如何,我都可以在浏览器中看到 .svc 和 wsdl 文件)我只能从我的机器或同一域中的任何其他机器使用该服务。如果我尝试通过应用程序(Windows 应用程序)从其他域访问服务。它给了我错误信息:-
“通信对象 System.ServiceModel.Channels.ServiceChannel 处于故障状态,无法用于通信”
堆栈跟踪: 服务器堆栈跟踪: 在 System.ServiceModel.Channels.CommunicationObject.Close(TimeSpan 超时)
在 [0] 处重新抛出异常:
在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg)
在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,Int32 类型)
在 System.ServiceModel.ICommunicationObject.Close(时间跨度超时)
在 System.ServiceModel.ClientBase1.System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout)
at System.ServiceModel.ClientBase
1.Close()
在 System.ServiceModel.ClientBase`1.System.IDisposable.Dispose()
在 AOLICWindows.Forms.SynchronizeTest.btnRegistration_Click(Object sender, EventArgs e)
【问题讨论】:
【参考方案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();
马克
【讨论】:
谢谢你,V 多马克。这有助于我找出实际问题。以上是关于从 Windows 应用程序访问托管在 IIS 上的 WCF 服务时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
如何从服务“内部”的代码访问托管在 IIS 中的 WCF 服务的 web.config
Windows 2016 IIS 上 HTTP/2 的混合模式