2015-12-25 5 views
1

У меня есть asp.net веб-служба и SoapExtension:Невозможно изменить содержание мыла сообщения перед десериализацией

public class PrefixExtention : SoapExtension 
{ 
    Stream _originalStream; 
    Stream _workingStream; 

    public override Stream ChainStream(Stream stream) 
    { 
     _originalStream = stream; 

     _workingStream = new MemoryStream(); 
     return _workingStream; 
    } 

    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) 
    { 
     return ((PrefixExtentionAttribute)attribute).Filename; 
    } 

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

    public override void Initialize(object initializer) 
    { 
     // do nothing 
    } 

    public override void ProcessMessage(SoapMessage message) 
    { 
     switch (message.Stage) 
     { 
      case SoapMessageStage.BeforeSerialize: 
       break; 
      case SoapMessageStage.AfterSerialize: 
       break; 
      case SoapMessageStage.BeforeDeserialize: 
       Copy(_originalStream, _workingStream); 
       ChangeStream(_workingStream); 
       break; 
      case SoapMessageStage.AfterDeserialize: 
       Copy(_originalStream, _workingStream); 
       LogMessageFromStream("1.txt", _workingStream); 
       break; 
      default: 
       throw new Exception("invalid stage"); 
     } 
    } 

    void Copy(Stream from, Stream to) 
    { 
     TextReader reader = new StreamReader(from); 
     TextWriter writer = new StreamWriter(to); 
     writer.WriteLine(reader.ReadToEnd()); 
     writer.Flush(); 
    } 

    private void LogMessageFromStream(string filename, Stream stream) 
    { 
     string soapMessage = string.Empty; 

     if (stream.CanRead && stream.CanSeek) 
     { 
      stream.Position = 0; 

      StreamReader rdr = new StreamReader(stream); 
      soapMessage = rdr.ReadToEnd(); 
      stream.Position = 0; 
     } 

     File.WriteAllText(filename, soapMessage); 
    } 

    private void ChangeStream(Stream stream) 
    { 
     Copy(_originalStream, _workingStream); 

     string soapMessage = string.Empty; 

     if (stream.CanRead && stream.CanSeek) 
     { 
      stream.Position = 0; 

      StreamReader rdr = new StreamReader(stream); 
      soapMessage = rdr.ReadToEnd(); 

      stream.Position = 0; 
     } 

     // do something with message 
     soapMessage = soapMessage.Replace("a:", ""); 
     soapMessage = soapMessage.Replace("xmlns:a=", "xmlns="); 

     MemoryStream memoryStream = new MemoryStream(); 
     StreamWriter writer = new StreamWriter(memoryStream); 
     writer.Write(soapMessage); 
     writer.Flush(); 
     memoryStream.Position = 0; 

     _workingStream.Position = 0; 
     Copy(memoryStream, _workingStream); 
     memoryStream.Close(); 
     _workingStream.Position = 0; 
    } 
} 

В методе ChangeStream() Я пытаюсь изменить содержание сообщения - удалить префиксы «а» из XML. Я меняю _workingStream на Copy (memoryStream, _workingStream); но тогда SoapMessageStage.AfterDeserialize не вызывается. Как я могу изменить сообщение для мыла, чтобы мой объект (в веб-методе) был десериализован правильно с измененным сообщением?

ответ

0

Я считаю, что это потому, что вы работаете с байтами, а не с строками, поэтому сначала вам нужно преобразовать Stream, который передается в строку ChangeStream. См. this answer для получения дополнительной информации.

EDIT: Вышеуказанное неверно. Кажется, вы уже читаете поток и кодируете его. Тем не менее, похоже, что вы пытаетесь заменить символы в строковом объекте, который может быть пустым, если поток tge равен null. Вы уверены, что получаете данные с вашего служебного вызова?

+0

Jerreck, как я могу это сделать в своем коде? – Anton23

+0

Да, ChangeStream() работает без исключений – Anton23

Смежные вопросы