我对从 Windows 计算机运行并使用位于 Apache 服务器上的 Web 服务的 WPF 应用程序有疑问。Windows 计算机是 AD 域的成员,Apache Web 服务需要 (AD) 身份验证。
Web 服务由 WCF 访问。正如预期的那样,它首先尝试获取 URL(webservice),获得 401 Unauthorized 然后再次尝试使用 auth(Windows auth 或 NTLM auth)。使用 auth 成功,一切都很好。
HTTP 连接是 Keep-Alive,并且 100 expect continue 已启用(但没有相同的结果)。标头是普通的,并且包含预期的 Content-Length(即 50kb)。
问题是在某些情况下 Apache2 将只读取标题部分,然后返回 401 响应。客户端不知道 Apache 决定结束这一切,继续发送内容 (xml)。由于这是一个保持活动的 Apache2 在这一点上期待下一个请求,而是从第一个请求 (XML) 接收正文并以“错误请求”响应。当 WCF 看到此响应时,它会停止并且不会重新发送带有 auth 标头的请求。Apache 日志文件确认了这一点,因为它将 XML 记录为通常记录 GET 的错误请求,并且客户端上的 Wireshark 确认了这一点,因为我在来自客户端的一个请求中看到来自 Apache 的两个 HTTP 响应。
由于客户端在标题中间添加了“Content-Length:54102”,我会说这是有问题的服务器(请注意,这一切都发生在执行 Apache 中的任何自定义代码之前)。服务器必须期望内容按照指定跟随,世界上的每个 HTTP 客户端都不能等待(最大延迟)中断等待服务器可能向标头发送标头响应。
所以我认为这个问题有两个解决方案:
- 修复阿帕奇。
- 使 WCF 在第一次请求时进行身份验证。
#1 是更适合服务器故障的服务器问题。
#2 可以在 C# 代码中完成,但从我的谷歌研究看来,人们可以通过基本身份验证来做到这一点(当你可以向用户询问用户/密码时)。然而,我需要它作为 Windows/NTLM 身份验证。
所以,我的问题是:如何在第一次请求时让 WCF Windows/NTLM 进行身份验证?
也欢迎有关此问题的任何其他想法/信息。