Мне еще не удалось заставить это работать в одном месте: (
IHttpHandler позволяет изменять SOAPAction в заголовках, но не в теле сообщения мыла.
SoapExtension позволяет изменять тело сообщения мыла, но не действие SOAPAction в заголовках.
Из моего тестирования нужно поменять оба, чтобы он работал ...
IHttpHandler:
public void ProcessRequest(HttpContext context)
{
string soapAction = context.Request.Headers["SOAPAction"];
context.Request.Headers.Set("SOAPAction", soapAction.Replace("OLD_NAMESPACE", "NEW_NAMESPACE"));
WebServiceHandlerFactory factory = new WebServiceHandlerFactory();
IHttpHandler handler = factory.GetHandler(context, context.Request.HttpMethod, context.Request.FilePath, context.Request.PhysicalPath);
handler.ProcessRequest(context);
context.Request.Headers.Set("SOAPAction", soapAction);
context.ApplicationInstance.CompleteRequest();
}
SoapExtension:
public class ReWriteExtension : SoapExtension
{
Stream inputStream;
Stream outputStream;
bool bPostDeserialize = false;
public override Stream ChainStream(Stream stream)
{
if (!bPostDeserialize)
{
//We’re deserializing the message, so stream is our input
//stream
this.inputStream = stream;
this.outputStream = new MemoryStream();
bPostDeserialize = true;
return outputStream;
}
else
{
//We’re serializing the message, so stream is the
//destination of our bits
this.inputStream = new MemoryStream();
this.outputStream = stream;
return inputStream;
}
}
public override object GetInitializer(Type serviceType)
{
return null;
}
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{
return null;
}
public override void Initialize(object initializer)
{
}
public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
ReWriteOutput(message);
break;
case SoapMessageStage.BeforeDeserialize:
ReWriteInput(message);
break;
case SoapMessageStage.AfterDeserialize:
break;
default:
throw new Exception("invalid stage");
}
}
public void ReWriteInput(SoapMessage message)
{
inputStream.Position = 0;
var sr = new StreamReader(inputStream);
var xmlMessage = sr.ReadToEnd();
xmlMessage = xmlMessage.Replace("OLD_NAMESPACE", "NEW_NAMESPACE");
outputStream.Position = 0;
var sw = new StreamWriter(outputStream);
sw.WriteLine(xmlMessage);
sw.Flush();
outputStream.Position = 0;
}
public void ReWriteOutput(SoapMessage message)
{
inputStream.Position = 0;
var sr = new StreamReader(inputStream);
var xmlMessage = sr.ReadToEnd();
xmlMessage = xmlMessage.Replace("NEW_NAMESPACE", "OLD_NAMESPACE");
var sw = new StreamWriter(outputStream);
sw.WriteLine(xmlMessage);
sw.Flush();
}
//void Copy(Stream from, Stream to)
//{
// if (from.CanSeek) from.Position = 0;
// if (to.CanSeek) to.Position = 0;
// TextReader reader = new StreamReader(from);
// TextWriter writer = new StreamWriter(to);
// writer.WriteLine(reader.ReadToEnd());
// writer.Flush();
// if (from.CanSeek) from.Position = 0;
// if (to.CanSeek) to.Position = 0;
//}
}
Все еще отчаянно пытаюсь получить все это в одном месте, но у меня это работает по крайней мере: /