当我使用 SSL 和客户端证书从浏览器外 Silverlight 4 应用程序调用 IIS 7.5(在 Windows 7 64 位上)失败时,我遇到了一个问题,并显示消息“I/O 操作已由于线程退出或应用程序请求而被中止。(0x800703e3)”。该请求确实将其发送到 IIS。这是失败请求跟踪的示例:
The I/O operation has been aborted because of either a thread exit or an application request. (0x800703e3) http://www.slipjig.org/IISError.gif
我使用的是浏览器 HTTP 堆栈,因为客户端 HTTP 堆栈不支持客户端证书。尝试访问服务器的客户端代码是 Prism 模块加载器。如果我在浏览器外运行应用程序但忽略客户端证书,或者如果我在浏览器中运行应用程序但需要客户端证书,它工作正常。似乎是两者的结合导致了问题。
我尝试了以下方法来收集更多信息:
尽管 Fiddler 的事情很有趣,但以上都没有给我提供超出我在跟踪文件中看到的有用信息。
有任何想法吗?提前致谢!
麦克风
最佳答案
在这个问题上,我用头撞墙了几个星期。这是我学到的东西以及我最终如何解决它。
Prism 的 FileDownloader 类使用 System.Net.WebClient 加载模块。在 OOB 模式下,WebClient 似乎使用与 IE 相同的堆栈,但它显然不发送客户端证书,或者(更有可能)没有正确协商与服务器的 SSL/客户端证书握手。我这样说是因为:
我无法很好地了解网络上实际发生的事情;如果我使用 Fiddler,它会起作用,因为 Fiddler 会拦截与服务器的通信并自行处理客户端证书握手。由于 SSL,尝试使用数据包嗅探器显然不会告诉我任何事情。
所以 - 我首先在服务器端花了很多时间试图消除可能导致问题的东西(不需要的处理程序、模块、功能等)。
当这不起作用时,我尝试修改 Prism 源代码以使用浏览器的 HTTP 堆栈而不是 WebClient。为此,我创建了一个设计类似于 FileDownloader 的新类,实现了 IFileDownloader,它使用了浏览器堆栈。然后我对 XapModuleTypeLoader(它实例化下载器)进行了一些更改,使其使用新类。这种方法失败了,与我最初遇到的错误相同。
然后我开始研究是否有商业第三方 HTTP 堆栈可用。我找到了一个支持我需要的功能并且支持 Silverlight 4 运行时的工具。我创建了另一个使用该堆栈的 IFileDownloader 实现,并且 BOOM - 它起作用了。
这种方法的好消息是,我不仅可以使用它来加载模块,还可以使用它来保护客户端和我们的 REST API 之间的通信(我们之前打算放弃的一个好处)。
我计划向 Prism 提交一个补丁,以允许下载器在外部注册或绑定(bind),因为它目前是硬编码的以使用自己的 FileDownloader。如果有人对此或我正在使用的商业 HTTP 堆栈感兴趣,请联系我 (msimpson -at- abelsolutions -dot- com) 获取链接和代码示例。
而且我必须这样说 - 我仍然不确定根本问题是在客户端还是服务器端的 HTTP 堆栈中,但它仍然是微软的失败。
关于Silverlight 4 OOB + 浏览器 HTTP 堆栈 + 客户端证书 = 失败?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3200652/