从 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.ClientBase1.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

WCF 托管在 IIS6 上

在 IIS 中托管可以从任何 Web 客户端访问的网站?

Windows 2016 IIS 上 HTTP/2 的混合模式

使用移动设备访问托管在 Windows 服务中的 WCF 服务

使用 Windows 身份验证的 IIS 托管 WCF 服务和 SQL 查询