У меня есть 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 не вызывается. Как я могу изменить сообщение для мыла, чтобы мой объект (в веб-методе) был десериализован правильно с измененным сообщением?
Jerreck, как я могу это сделать в своем коде? – Anton23
Да, ChangeStream() работает без исключений – Anton23