我正在将一个在 .NET 3.5+ 中工作的 .NET 应用程序移植到 WinRT,它包括一个 WCF 服务客户端(使用ChannelFactory<T>
编程方式创建),它几乎与原始版本共享其所有代码(即尽可能多地相同)该程序。该服务通过端口 9443 上的 SSL 访问,并使用 Windows 身份验证。代码的原始版本完美运行,但 WinRT 端口通常会因三层异常而失败:我得到一个EndpointNotFoundException
(“在 https://... 处没有端点监听”),内部异常为WebException
( “无法连接到远程服务器”),内部异常为SocketException
(“试图以访问权限 192.168.xx:9443 禁止的方式访问套接字”)。
奇怪的是,除非我让 Fiddler 作为代理并捕获流量,否则这将始终失败。
现在,更多细节。
- SSL 证书是有效的,来自受信任的机构,并且涵盖了附加到我的 IIS 站点的主机头名称(并且仅包含该名称)。
- 我可以浏览到 .svc 文件及其 ?wsdl 而不会出现任何错误,并且 wsdl 本身会报告我在应用程序中使用的确切 URL。
- 有问题的站点在 9443 上绑定了 https,在 9999 上绑定了 http(两者都有与之关联的主机头名称)
我在站点根目录中有以下 clientaccesspolicy.xml,并且可以通过 http 和 https 通过适当的端口访问它:
<?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="*"> <domain uri="*" /> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy>
运行该服务的服务帐户有一个与之关联的 UPN,因为有人建议这可能会有所帮助。我尝试将其放入
<servicePrincipalName/>
我的端点中<identity />
,但无济于事;使用<dns />
那里也没有帮助。- 绑定是
BasicHttpBinding
withBasicHttpSecurityMode.Transport
,我正在设置ClientCredentialType = HttpClientCredentialType.Windows
。凭据当前是硬编码的并且是正确的。但我认为这些都不是问题,因为... - 我可以在循环中设置服务调用并观察它失败,失败,失败,失败,直到我 Alt+Tab 切换到 Fiddler 并开始捕获流量。据我了解,这会通过 Fiddler 的本地代理重定向服务调用,并且无论出于何种原因,它都能完美地工作——我什至不需要重新启动程序,更不用说重新编译它了。
- 无论我是否将 Fiddler 的中间人证书安装为受信任,无论我是否选择解码 SSL 会话,这都是一样的。
- 当我使用 Fiddler 执行此操作时,我看到的流量对我来说并不是特别有启发性。看起来像标准的协商握手,带有 HTTP 401 错误,然后是成功的连接。
- IIS 是第 7 版。日志(在 inetpub\logs 中)似乎没有显示任何有趣的东西——事实上,除非连接了 Fiddler,否则我似乎从来没有看到任何东西,当一切正常时。
- 我尝试使用 Wireshark 来嗅出这一点,但结果对我来说基本上没用。在我开始在 Fiddler 中捕获之前,Wireshark 甚至看起来都没有拾取任何东西,然后我得到了流量,但我不知道我是否只是看错了。
- 尝试使用添加服务引用添加标准 Visual Studio 代理会导致与我的自定义代码完全相同的行为。
- 只是为了好玩,为了看看 WinRT 是否像 Silverlight 那样对端口有未发布的限制,我将站点设置在端口 4505 上(在 4502-4534 范围内)。没有改变。
- 清除 Internet 选项中的缓存和 cookie 似乎无关紧要。
- Windows 防火墙已关闭。Windows 8 是否有任何其他可能的交通障碍?(没关系,因为桌面应用程序一直运行良好。)
- Windows Defender 实时保护已关闭。
- 即使我在模拟器上运行应用程序,行为也是一样的。我无法在另一台物理机器上进行测试,因为这是我唯一的 Windows 8 开发安装。
希望这表明我已经对此进行了尽职调查。我错过了什么?如果我能提供更多信息,请告诉我。