.net - 是什么导致 "HTTP status 401: OK"

标签 .net asp.net web-services http-status-codes

我有一个 ASP.NET Web 服务,当我偶尔调用它时它返回正确的响应,其他时候它返回异常 请求失败,HTTP 状态 401:OK。 有人可以吗给我一些为什么会发生这种情况的原因?因为我似乎无法在 HTTP 401 和 OK 消息上找到任何内容,因为 200 是 OK 而 401 是未授权的......为什么我在 IIS6 中托管的 Web 服务会返回这个?

这是直接的异常详细信息:

Message:
    The request failed with HTTP status 401: OK.
Stack Trace:
    at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
    at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
    at ws.Main.MethodName(param1, param2)

当我收到此错误时,我将尝试获取 WireShark 数据包跟踪。

客户端和 Web 服务都是我们维护的代码。异常只是间歇性地发生,并非总是发生,传递的凭据详细信息是帐户的有效 AD 用户详细信息,并且 IIS 站点正在使用 Windows 身份验证。

最佳答案

我找到了原因并有了答案。

问题是由多个线程通过同一 TCP 管道同时访问 WebService 引起的。这导致 IIS 重置身份验证握手,结果应用程序收到 HTTP 401 UNAUTHORIZED 异常代替 200 OK 消息,.NET 报告响应是 HTTP 401 OK,但是使用 WireShark 我能够确定内容仍然是 HTTP 401 UNAUTHORIZED

由于问题的多线程性质,我们的问题时断时续地发生。

解决方案是编写一个包含我们自动生成的 ws 代理类(来自 WSDL)的新代理类,并在这个新代理类中的每个方法上实现一个 SYNCLOCK 对象。

当我使用服务器名称而不是 DNS 名称时,问题似乎也消失了,因为每个单独的线程调用都在不同的 TCP 管道上进行。

关于.net - 是什么导致 "HTTP status 401: OK",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7297707/

相关文章:

java - 如何解析 Play 2.3.x 中 WebService 调用的响应

c# - 将 C# DataTable 的序列化实例转换为 java

c# - 如何在文本文件中向上/向下移动项目

c# - Blazor Maui 应用程序不支持本地 Android 设备

asp.net - 根据角色重定向到其他页面

mysql - 太高的 MySQL innodb 缓冲池大小会导致内核交换守护进程 (kswapd0) 的高负载吗?

c# - 设置动态创建的枚举值的赋值表达式

c# - 无法安装软件包 'Stripe.net 39.27.0' 。您正在尝试将此软件包安装到目标为 '

c# - 在 ASP.NET 中使用 Ext JS

c# - 在 ubuntu 16.04 上安装 "monodevelop"IDE 后找不到 asp.net 模板