2015-01-13 2 views
1

.net 응용 프로그램에서 .Net SOAP 웹 서비스 (ESB 서비스)를 사용하지 않습니다. 웹 참조 추가를 사용하여 참조 또는 서비스를 추가했습니다..Net SOAP 웹 서비스가 아닌 SOAP 요청 및 응답을 기록하십시오.

이제이 서비스의 모든 메소드를 호출 할 때 비누 요청 및 응답을 기록하고 싶습니다. 그리고 데이터베이스에 요청/응답을 저장하려고합니다.

로그하는 방법을 알려주십시오 .Net SOAP 웹 서비스의 SOAP 요청 및 C#의 응답?

+0

가능한 경우 "서비스 참조 추가"를 사용해야합니다. 그렇게하면 WCF의 기본 제공 추적 기능을 사용할 수 있습니다. –

+0

하지만 서비스는 WCF 서비스가 아닙니다 – Rahul

+0

어떤 서비스를 제공하는지는 중요하지 않습니다. Java 기반 서비스에서도 동일한 작업을 수행 할 수 있습니다. –

답변

2

이 코드는 작성된 코드 당신은 로그 파일의 전체 요청 및 응답을 로깅하는 SoapExtension을 구현할 수 있습니다 내 ^^

아니라, this 게시물에서입니다. 그런 다음 디버깅을 위해 쉽게 켜거나 끌 수있는 web.config에서 SoapExtension을 활성화 할 수 있습니다. 다음은 log4net을 사용하여 로깅을 수행하는 방법을 보여 주지만 내 용도로 사용하기 위해 찾아서 수정 한 예제입니다. 그러나 로그 메서드를 직접 사용할 수는 있습니다.

<webServices> 
    <soapExtensionTypes> 
    <add type="YourNamespace.SoapLoggerExtension, YourAssembly" 
     priority="1" group="0" /> 
    </soapExtensionTypes> 
</webServices> 

하거나 Fiddler 시도 : 당신 SoapExtension의 클래스 및 어셈블리에 YourNamespace 및 YourAssembly 지점이 어디

public class SoapLoggerExtension : SoapExtension 
{ 
    private static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 
    private Stream oldStream; 
    private Stream newStream; 

public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) 
{ 
    return null; 
} 

public override object GetInitializer(Type serviceType) 
{ 
    return null; 
} 

public override void Initialize(object initializer) 
{ 

} 

public override System.IO.Stream ChainStream(System.IO.Stream stream) 
{ 
    oldStream = stream; 
    newStream = new MemoryStream(); 
    return newStream; 
} 

public override void ProcessMessage(SoapMessage message) 
{ 

    switch (message.Stage) 
    { 
     case SoapMessageStage.BeforeSerialize: 
      break; 
     case SoapMessageStage.AfterSerialize: 
      Log(message, "AfterSerialize"); 
       CopyStream(newStream, oldStream); 
       newStream.Position = 0; 
      break; 
      case SoapMessageStage.BeforeDeserialize: 
       CopyStream(oldStream, newStream); 
       Log(message, "BeforeDeserialize"); 
      break; 
     case SoapMessageStage.AfterDeserialize: 
      break; 
    } 
} 

public void Log(SoapMessage message, string stage) 
{ 

    newStream.Position = 0; 
    string contents = (message is SoapServerMessage) ? "SoapRequest " : "SoapResponse "; 
    contents += stage + ";"; 

    StreamReader reader = new StreamReader(newStream); 

    contents += reader.ReadToEnd(); 

    newStream.Position = 0; 

    log.Debug(contents); 
} 

void ReturnStream() 
{ 
    CopyAndReverse(newStream, oldStream); 
} 

void ReceiveStream() 
{ 
    CopyAndReverse(newStream, oldStream); 
} 

public void ReverseIncomingStream() 
{ 
    ReverseStream(newStream); 
} 

public void ReverseOutgoingStream() 
{ 
    ReverseStream(newStream); 
} 

public void ReverseStream(Stream stream) 
{ 
    TextReader tr = new StreamReader(stream); 
    string str = tr.ReadToEnd(); 
    char[] data = str.ToCharArray(); 
    Array.Reverse(data); 
    string strReversed = new string(data); 

    TextWriter tw = new StreamWriter(stream); 
    stream.Position = 0; 
    tw.Write(strReversed); 
    tw.Flush(); 
} 
void CopyAndReverse(Stream from, Stream to) 
{ 
    TextReader tr = new StreamReader(from); 
    TextWriter tw = new StreamWriter(to); 

    string str = tr.ReadToEnd(); 
    char[] data = str.ToCharArray(); 
    Array.Reverse(data); 
    string strReversed = new string(data); 
    tw.Write(strReversed); 
    tw.Flush(); 
} 

private void CopyStream(Stream fromStream, Stream toStream) 
{ 
    try 
    { 
     StreamReader sr = new StreamReader(fromStream); 
     StreamWriter sw = new StreamWriter(toStream); 
     sw.WriteLine(sr.ReadToEnd()); 
     sw.Flush(); 
    } 
     catch (Exception ex) 
     { 
      string message = String.Format("CopyStream failed because: {0}", ex.Message); 
      log.Error(message, ex); 
     } 
    } 
} 
[AttributeUsage(AttributeTargets.Method)] 
public class SoapLoggerExtensionAttribute : SoapExtensionAttribute 
{ 
    private int priority = 1; 

    public override int Priority 
    { 
     get { return priority; } 
     set { priority = value; } 
    } 

    public override System.Type ExtensionType 
    { 
     get { return typeof (SoapLoggerExtension); } 
    } 
} 

당신은 다음의 web.config에 다음 섹션을 추가합니다. 요청 및 응답을 검사 할 수 있습니다. Fiddler가 http 및 https 트래픽과 함께 작동한다는 점은 주목할 가치가 있습니다.

+0

이 코드를 web.config에 추가했습니다. 내 메서드를 호출 할 때 trace.log가 생성되지 않고 요청 응답을 볼 수 없습니다. – Rahul

+0

@Rahul - 위 예제에서 initializeData 속성의 값을 조정하여 trace.log 파일의 경로를 설정할 수 있습니다. - – Unlockedluca

+0

bin/debug 폴더의 trace.log에서 응답 및 요청 태그를 볼 수는 있지만 올바르지 않습니다. 나는 단순히 그것을 복사하고 soap ui로 실행할 수 없습니다. 데이터베이스에 req/resp하는 다른 방법이 있습니까? – Rahul