2011-09-04 180 views
2

我有一个ASP.NET Web服务,当我偶尔调用它时,它会返回正确的响应,其他时候它会返回异常The request failed with HTTP status 401: OK.有人可以请我提供一些原因,会发生?由于我无法在HTTP 401上找到任何内容,并且出现OK的消息,因为200是正常的,而且401是未授权的...为什么我的Web服务在IIS6中托管会返回?什么原因导致“HTTP状态401:确定”

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

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身份验证。

+1

当收到401时,请求发出时请求的Web服务的数据是否存在?它可能是Web服务中的一个“bug”,或者Web服务无法找到请求的数据,并返回[401而不是404](http://stackoverflow.com/questions/4038981/)为了安全起见,或者它可能完全是其他的东西,它可以返回-http-401-for-a-non-existant-resource-404-to-preve) – Zabba

+0

我收到非常零星的401:未经授权,所以这个问题引起了我的注意。你是否从服务中捕获异常细节?您是否有权访问服务器以查看事件查看器中是否有信息?我也试图得到一个分析器,所以我很好奇你发现了什么。您使用哪种绑定和安全模式? – McArthey

+0

问题是我们看到这个401确定有时会返回,即使方法代码只是在另外一个空方法中返回True。正如我现在在我更新的问题中所说的,客户端和Web服务都是我们维护的代码。 – Seph

回答

2

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

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

由于问题的多线程性质,我们曾经非常间歇地发生这种情况。

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

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

0

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

0

401未授权

到403故宫相似,但专为使用在认证 是可能的,但发生故障或尚未提供。

这意味着您没有对您尝试访问的资源的权限,并且认证可能会有所作为。我不认为OK是相对的,虽然它是不寻常的。检查actual Http Status code in Fiddler以确保。

相反:

403禁止

请求是合法的请求,但服务器拒绝回应 它。与401未经授权的响应不同,身份验证不会产生 的差异。

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

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

认为我可能也有类似的行为,当IIS不能处理已认证的流量,它只是弹了一个401我从来没有注意到确定,但很可能发生在这种情况下。

+0

服务在单个服务器上没有农场。它很好地工作很长时间然后一个呼叫说1000将失败,但接下来的10,000将工作正常,然后在100失败3次等(数字仅供参考)..我几乎认为问题是广告花太长的时间回复..但最重要的问题是为什么它是'401 OK'而不是'401 Unauthorized'... 401确实没有意义吗? – Seph

+0

更新了一些更多的想法。 – TheCodeKing

相关问题