문제

가 WCF 서 호스팅하는 서비스에서 IIS/ASP.순이 허용하는 HTTP 포스트(지 않는 게시물 양식 로)직렬화 개체입니다.

클라이언트가 보내는 형식이 잘못된 요청(예를 들어 그들은지를 직렬화하는 개체를 올바르게)내가 좋아하는 로그 메시지를 보냈습니다.

우리는 이미 사용 를를 캡처하는 예외 처리되지 않은,그래서 단순히 부착시 데이터는 것이 가장 쉬운 방법입니다.

나를 얻을 수 있는 현재 HttpContext 중에는 예외 그러나 이것만 포함한 HTTP 헤더 정보입니다.

나의 질문은 이것입니다:는 몇 가지 방법이 있을 캡처 원하는 HTTP 요청 게시 몸?거나,실패하는 더 나은 방법(역방향 프록시 없이)의 캡쳐 입력 오류가 발생?

편집:그냥을 명확히 하고 실행하는 패킷 수준을 캡처 모든 시간에 정말 되지 않습니다 적합합니다.난 후에 하는 솔루션을 나는 배포할 수 있는 생산을 서버는 클라이언트의 통제 또는 모니터링하는 기능.

편집#2:제안이 되었다 액세스하는 요청을 합니다.InputStream-이 작동하지 않는 경우에 당신은 노력하고 읽기 후 WCF 읽고 요청을 해제합니다.

샘플 코드 조각을 볼 어떻게 사용해 봤지만 이것은 여기에 있습니다.

        StringBuilder log = new StringBuilder();

        var request = HttpContext.Current.Request;

        if (request.InputStream != null)
        {
            log.AppendLine(string.Format("request.InputStream.Position = \"{0}\"", request.InputStream.Position));
            if (request.InputStream.Position != 0)
            {
                request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
            }

            using (StreamReader sr = new StreamReader(request.InputStream))
            {
                log.AppendLine(string.Format("Original Input: \"{0}\"", sr.ReadToEnd()));
            }
        }
        else
        {
            log.AppendLine("request.Inputstream = null");
        }


        log.ToString();

Ouput 의 로그입니다.ToString()입니다:

    request.InputStream.Position = "0"
    Original Input: ""
도움이 되었습니까?

해결책

에 의해 도달하는 시간 당신의 서비스는 요청을 처리하고 사용할 수 없습니다.

그러나...할 수 있습 첨부 관리자 메시지.메시지를 검사할 수 있으로 메시지가 도달하기 전에 당신의 가동을 실현하였다.을 만들 수 있습 버퍼에 복사의 메시지,그리고 복사 OperationContext.현재 있습니다.

추한 해킹의 과정,그리고 그것이 의미하는 메모리 오버헤드로 지금 두 사본의 메시지는 부동에 대한 모든 요청을 합니다.

다른 팁

system.web.request.inputstream 속성을 보셨습니까? 정확히 당신이 원하는 것을 가져야합니다.

입력 속성을 "되감기"하는 방법.

    if (Request.InputStream.Position != 0)
    {
        Request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
    }

당신이 조사해야 할 또 다른 옵션은 BeginRequest 이벤트에서 HTTPModule을 사용 하여이 정보를 캡처하는 것입니다. WCF가 승인 후까지 WCF가 요청을 선택한다고 생각하지 않기 때문에 데이터는 BeginRequest 이벤트에 있어야합니다.

아래 ASP.NET (IIS의 ASP 웹 서비스)에서 다음 코드가 도움이됩니다.

if (request.InputStream.Position != 0)
{
  request.InputStream.Seek(0, System.IO.SeekOrigin.Begin);
}

WCF는 다를 수 있습니다 (즉, 읽은 후 입력 스트림을 처리합니다)

피들러를 사용하십시오. MS가 없습니다. 잘 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top