2010-04-06 3 views

답변

11

대안은에오고으로 IHttpModule을 구현하고 입력 스트림을 잡아하는 것입니다.

public class LogModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += this.OnBegin; 
    } 

    private void OnBegin(object sender, EventArgs e) 
    { 
     HttpApplication app = (HttpApplication)sender; 
     HttpContext context = app.Context; 

     byte[] buffer = new byte[context.Request.InputStream.Length]; 
     context.Request.InputStream.Read(buffer, 0, buffer.Length); 
     context.Request.InputStream.Position = 0; 

     string soapMessage = Encoding.ASCII.GetString(buffer); 

     // Do something with soapMessage 
    } 

    public void Dispose() 
    { 
     throw new NotImplementedException(); 
    } 
} 
+2

깨 있지만 Web.config의에 IHttpModule을 등록해야 할 수도 있습니다 <의 system.webServer> <이름 = "LogModule"유형 = "MyNameSpace.LogModule"를 추가 />

1

난 당신이 추적에 대한 SOAP 요청을 기록하고자한다고 가정; 어쩌면 당신은 당신에게 좋은 SOAP을 보내고 있다고 말하고있는 당신의 서비스 소비자를 가졌지 만 당신은 그들을 믿지 않습니다, 네?

그런 경우 (일시적으로) enable trace logging on your service해야합니다.

일반적인 목적의 로깅을 수행하려는 경우 SOAP 패킷이 무거워서 신경 쓸 필요가 없습니다. 로그가 빨리 부 풀릴 것입니다. 예를 들어 중요한 정보를 기록하십시오. "호출 된 추가, X = foo, Y = bar".

+1

불행히도 영구적 일 필요가 있으므로 일시적으로 추적을 활성화 할 수 없습니다. –

+0

@bangoker : 즉각적인 필요를 채워주는 해결책을 찾았음에도 불구하고 코스를 다시 생각해 보시기 바랍니다. 모든 SOAP 요청을 로깅하는 것은 무거 우며 매우 불필요합니다. – Randolpho

6

예, SoapExtensions를 사용하여 수행 할 수 있습니다. 이 과정을 수행하는 nice article은 다음과 같습니다. SoapExtensions에

+0

내가 뭘 찾고 있었는지, 고마워! 고마워! –

+4

링크가 끊어졌습니다. 링크 이후 답변으로 – wRAR

+0

표시 해제가 어쩌면 명백한 –

5

당신은 또한 contents of the Request.InputStream를 읽을 수 있습니다.

입력 내용에 따라 WebMethod에서 유효성 검사 또는 다른 작업을 수행하려는 경우에 유용합니다.

using System; 
using System.Collections.Generic; 
using System.Web; 
using System.Xml; 
using System.IO; 
using System.Text; 
using System.Web.Services; 
using System.Web.Services.Protocols; 

namespace SoapRequestEcho 
{ 
    [WebService(
    Namespace = "http://soap.request.echo.com/", 
    Name = "SoapRequestEcho")] 
    public class EchoWebService : WebService 
    { 

    [WebMethod(Description = "Echo Soap Request")] 
    public XmlDocument EchoSoapRequest(int input) 
    { 
     // Initialize soap request XML 
     XmlDocument xmlSoapRequest = new XmlDocument(); 

     // Get raw request body 
     Stream receiveStream = HttpContext.Current.Request.InputStream 

     // Move to begining of input stream and read 
     receiveStream.Position = 0; 
     using (StreamReader readStream = new StreamReader(receiveStream, Encoding.UTF8)) 
     { 
     // Load into XML document 
     xmlSoapRequest.Load(readStream); 
     } 

     // Return 
     return xmlSoapRequest; 
    } 
    } 
} 

참고 : 아래 존스의 의견을 반영하기 위해 업데이트되었습니다.

+0

이 코드를 사용해 보셨습니까? 다른 것들 중에서,''스트림 (Stream) '을 만들지 않으므로''블록 (blocks)을 사용해야한다고 생각하지 않습니다. 'StreamReader'는 또한'using' 블록 안에 있으면 안됩니다. 왜냐하면 그것을 버리면 스트림을 닫을 것이고 스트림은 여러분에게 속하지 않기 때문입니다. 또한 나중에 구성 될 수있는 SoapExtension과 상호 운용되는지 여부에 대해서도 질문을 던집니다. –

+0

네, 코드를 구조화하는 방법에 대한 프로그래머의 선택을 사용하거나 사용하지 않는 것처럼 링크를 클릭하여 시도해 보았습니다. –

+1

@Steven :이 경우에는'사용 중 '에 대해 틀 렸습니다. 만약'(var x = new StreamReader())'를 사용했다면 그것은 선택이 될 것입니다 -'StreamReader'는 당신이 그것을 생성했기 때문에 당신에게 속합니다. 이 경우,'Stream'은'Request' 객체에 속합니다. 당신은 그것을 만들지 않았으므로,'Dispose'를 호출해서는 안됩니다. –

관련 문제