导致“HTTP状态401:OK”的原因

时间:2011-09-04 06:19:08

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

我有一个ASP.NET Web服务,当我偶尔调用它时会返回正确的响应,有时它会返回异常The request failed with HTTP status 401: OK.有人可以告诉我为什么会发生这种情况吗?因为我似乎无法在HTTP 401上找到任何内容以及OK的消息,因为200是正常的而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身份验证。

3 个答案:

答案 0 :(得分:2)

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

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

由于问题的多线程性质,我们非常间歇地发生。

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

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

答案 1 :(得分:1)

  

401未经授权

     

类似于403 Forbidden,但专门用于身份验证时使用   是可能的,但已经失败或尚未提供。

这意味着您没有对您尝试访问的资源的权限,并且身份验证可能会有所不同。我不认为OK是相关的,尽管这是不寻常的。检查actual Http Status code in Fiddler以确定。

相反:

  

403 Forbidden

     

请求是合法请求,但服务器拒绝回复   它。与401 Unauthorized响应不同,身份验证将不会   差。

农场服务?可能是一台服务器配置不正确。

根据您的上一条评论,您应检查是否存在导致意外行为的资源泄漏。如果您使用数据库确保处置一次性对象等,请配置服务器以监视内存使用情况。如果您有长时间运行的请求,请考虑异步服务以保持线程池空闲。检查事件日志。

认为当IIS无法处理经过身份验证的流量时,我可能已经看到了类似的行为,它只是用401炸弹。我从未注意到OK,但在这种情况下很可能会发生。< / p>

答案 2 :(得分:0)

401表示您尝试访问受密码保护的资源,而不在请求中包含任何身份验证信息。检查您是否错误配置了服务器以要求返回响应的URL的密码,并检查所有请求是否都在同一域中:您可能无意中向密码保护域发出请求(我举例说明)过去看到的是使用单独的主机来提供静态文件,但是静态文件虚拟主机已经设置了HTTP基本身份验证。)