2011-09-04 2 views
2

ASP.NET 웹 서비스가 있는데 가끔씩은 올바른 응답을 반환 할 때 예외를 반환하는 다른 시간이 반환됩니다 The request failed with HTTP status 401: OK. 누군가이 기능을 제공하는 이유에 대해 설명해주십시오. 일어날거야? HTTP 401과 메시지가 OK이면 200이 OK이고 401이 Unauthorized이므로 아무것도 찾을 수없는 것처럼 ... IIS6에서 호스팅되는 웹 서비스가 이것을 반환하는 이유는 무엇입니까?"HTTP 상태 401 : OK"의 원인

여기에 직접 예외 세부 사항을이다 : 나는이 함께 제공하고 때이 오류에 대한 WireShark로 패킷 추적을 얻으려고 노력한다

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) 

.

클라이언트와 웹 서비스는 모두 우리가 관리하는 코드입니다. 예외는 간헐적으로 만 발생하며 항상 전달되는 자격 증명 세부 정보는 계정의 유효한 AD 사용자 세부 정보이며 IIS 사이트는 Windows 인증을 사용합니다.

+1

는 시간에 존재하는 웹 서비스로 요청 된 데이터를 요청한다입니까? 웹 서비스의 "버그"일 수도 있고 웹 서비스가 요청 된 데이터를 찾을 수없고 404 대신 [401]을 반환합니다 (http://stackoverflow.com/questions/4038981/). http-401-for-a-non-existant-resource-of-404-to-preve), 보안상의 이유로 또는 전혀 다른 것일 수도 있습니다. – Zabba

+0

나는 아주 산발적 인 401을 받는다 : 허가받지 않은이 질문은 나의주의를 끌었다. 서비스에서 예외 세부 사항을 캡처하고 있습니까? 이벤트 표시기에 정보가 있는지보기 위해 서버에 액세스 할 수 있습니까? 나는 또한 분석기를 얻으려고 노력하고있어서 당신이 무엇을 발견하는지 궁금합니다. 어떤 바인딩 및 보안 모드를 사용하고 있습니까? – McArthey

+0

문제는 메소드 코드가 빈 메소드에서 단순히 'Return True' 인 경우에도이 401 OK가 때때로 반환되는 것을 볼 수 있다는 것입니다. 업데이트 된 질문에서 클라이언트와 웹 서비스는 모두 우리가 유지 관리하는 코드입니다. – Seph

답변

2

나는 그 원인을 발견하고 대답했다.

문제

동일한 TCP 파이프 위에 동시에 WebService에 액세스하는 다수의 스레드에 의해 발생되었다. 이로 인해 IIS가 인증 핸드 셰이크를 다시 설정하고 응용 프로그램이 200 OK 메시지 대신 HTTP 401 UNAUTHORIZED 예외를 수신하면 .NET에서 응답이 HTTP 401 OK이라고보고했지만 WireShark를 사용하여 콘텐츠가 여전히 HTTP 401 UNAUTHORIZED 인 것으로 확인할 수있었습니다. .

인해 문제의 다중 스레드 특성으로 우리는 아주 간헐적으로 발생했다.

솔루션은 새로운 프록시합니다 (WSDL에서) 우리의 자동 생성 WS 프록시 클래스를 포함 클래스와 새로운 프록시 클래스 내에서 모든 방법을 통해의 SyncLock 객체 구현을 작성했다.

문제

는 각각 별도의 스레드 호출이 다른 TCP 파이프에 갔다하기 때문에 서버 이름이 아닌 DNS 이름을 사용 할 때 멀리 갈 것 같았다.

401가 수신
0

401은 요청에 인증 정보를 포함하지 않고 암호로 보호 된 자원에 액세스하려고 시도했음을 나타냅니다. 응답을 반환하는 URL에 비밀번호가 필요하도록 서버를 잘못 구성하지 않았는지 확인하고 모든 요청이 동일한 도메인에 있는지 확인하십시오. 실수로 비밀번호로 보호 된 도메인에 요청을 발행 할 수 있습니다 (예를 들어 과거에는 정적 파일을 제공하기 위해 별도의 호스트를 사용했지만 정적 파일 가상 호스트에는 HTTP 기본 인증이 설정되어있었습니다. 금지 된 (403) 유사

무단 있지만 특별히 사용

0

401 인증이 가능하지만 고장이거나 아직 제공되지 않았다.

즉, 액세스하려는 리소스에 대한 사용 권한이 없으며 인증으로 인해 차이가 발생할 수 있습니다. 나는 이상한 일이지만 OK이 relavent라고 생각하지 않는다. actual Http Status code in Fiddler을 확인하십시오. 반대로

은 :

403

요청

법적 요청이었다 금지하지만, 서버는에 응답을 거부한다. 401 Unauthorized 응답과 달리 인증을하면 의 차이가 없습니다.

서비스가 팜에 있습니까? 하나의 서버가 올바르게 구성되지 않았을 수 있습니다.

마지막 코멘트를 기반으로 예기치 않은 동작을 일으키는 리소스 누출이 없는지 확인해야합니다. 데이터베이스를 사용하여 일회용 객체 등을 처분하는 경우 서버에서 메모리 사용을 모니터링하도록 프로파일하십시오. 장기 실행 요청이있는 경우 비동기 서비스를 고려하여 스레드 풀을 비워 두십시오. 이벤트 로그를 확인하십시오.

나는 IIS 트래픽을 인증 처리 할 수없는 때 비슷한 동작을 볼 수도 생각 하는 (401)와 그것을 밖으로 단지 폭탄 나는 OK (확인)를 발견,하지만 물론이 시나리오에서 발생할 수 않았다.

+0

서비스가 단일 서버에 있으며 팜이 없습니다. 그것은 오랜 시간 동안 괜찮아요 다음 한 통화 1000 말할 것입니다 실패하지만 다음 10,000 잘 작동합니다 및 다음 세 번 100 실패합니다 (가이드 수만) .. 나는 거의 문제가 AD 생각입니다 답장하는 데 너무 오래 걸립니다.하지만 가장 중요한 질문은 '401 OK'가 아닌 '401 Unauthorized'가 아닌 이유입니다 ... 401 OK는 그냥 이해가되지 않습니까? – Seph

+0

몇 가지 아이디어로 업데이트되었습니다. – TheCodeKing

관련 문제