我有一个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身份验证。
答案 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基本身份验证。)