2013-07-11 2 views
0

웹 서비스에 오류가 발생하면 응답을 보내고 SoapExtension을 사용하여 응답합니다. 요청 및 응답 XMLDocument의 데이터가 모두 잘못되었습니다. 누군가 내가 잘못하고있는 것을보기 위해 코드를 검토 할 수 있습니까? SoapExtension의 변경 사항을 중앙 집중화 할 수 없다면 각 웹 서비스 엔드 포인트 주변에 로깅 코드를 추가 할 것입니다.두 웹 서비스 모두 요청, 응답을 SoapExtension에 기록하십시오.

답변

1

XMLRequest, XMLResponse 속성에 대한 "정적"속성을 제거하여 해결했습니다. 또한 "SoapMessageStage.AfterSerialize"프로세스 중 "XMLResponse"및 "SoapMessageStage.BeforeSerialize"프로세스 중 "XMLRequest"를 가져옵니다. 나는 이전에 그것을 바꿨다.

using System; 
using System.IO; 
using System.Web.Services.Protocols; 
using System.Xml; 

using Elmah; 

public class ElmahSoapExtensionV2 : SoapExtension 
{ 
    private Stream oldStream; 
    private Stream newStream; 

    public XmlDocument XmlRequest { get; private set; } 
    public XmlDocument XmlResponse { get; private set; } 

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

    public override void ProcessMessage(SoapMessage soapMessage) 
    { 
     switch (soapMessage.Stage) 
     { 
      case SoapMessageStage.BeforeSerialize: 
       break; 
      case SoapMessageStage.AfterSerialize: 
       XmlResponse = GetSoapEnvelope(newStream); 
       if (soapMessage.Exception != null) 
       { 
        var exception = soapMessage.Exception.GetBaseException(); 
        exception.Data.Add("SoapRequest", XmlRequest.OuterXml); 
        exception.Data.Add("SoapResponse", XmlResponse.OuterXml); 
        ErrorSignal.FromCurrentContext().Raise(exception); 
       } 
       CopyStream(newStream, oldStream); 
       break; 
      case SoapMessageStage.BeforeDeserialize: 
       CopyStream(oldStream, newStream); 
       XmlRequest = GetSoapEnvelope(newStream); 
       break; 
      case SoapMessageStage.AfterDeserialize: 
       break; 
     } 
    } 

    private static XmlDocument GetSoapEnvelope(Stream stream) 
    { 
     var xmlDocument = new XmlDocument(); 
     stream.Position = 0; 
     var streamReader = new StreamReader(stream); 
     xmlDocument.LoadXml(streamReader.ReadToEnd()); 
     stream.Position = 0; 
     return xmlDocument; 
    } 

    private static void CopyStream(Stream streamFrom, Stream streamTo) 
    { 
     var textReader = new StreamReader(streamFrom); 
     var textWriter = new StreamWriter(streamTo); 
     textWriter.WriteLine(textReader.ReadToEnd()); 
     textWriter.Flush(); 
    } 

    #region MyRegion 
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) 
    { 
     return null; 
    } 
    public override object GetInitializer(Type WebServiceType) 
    { 
     return null; 
    } 
    public override void Initialize(object initializer) 
    { 
    } 
    #endregion 
} 
관련 문제