WCF IClientMessageInspector.BeforeSendRequest modify request

本文关键字:request modify BeforeSendRequest IClientMessageInspector WCF | 更新日期: 2023-09-27 18:36:15

我正在尝试修改WCF服务中的请求。

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
    string xmlRequest = request.ToString();
    XDocument xDoc = XDocument.Parse(xmlRequest);
    //Some request modifications
    //Here i have XML what in want to send
    request = Message.CreateMessage(request.Version, request.Headers.Action, WhatHere?);
    request.Headers.Clear();            
    return null;
}

但是我不知道我可以在CreateMessage中设置什么,或者可能是将XML设置为请求的不同方法。

WCF IClientMessageInspector.BeforeSendRequest modify request

可以传递表示修改后的消息的 XmlReader 对象。下面是如何通过自定义消息检查器检查和修改 WCF 消息一文中的示例。

public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
    Console.WriteLine("====SimpleMessageInspector+BeforeSendRequest is called=====");
    //modify the request send from client(only customize message body)
    request = TransformMessage2(request);
    return null;
}
//only read and modify the Message Body part
private Message TransformMessage2(Message oldMessage)
{
    Message newMessage = null;
    //load the old message into XML
    MessageBuffer msgbuf = oldMessage.CreateBufferedCopy(int.MaxValue);
    Message tmpMessage = msgbuf.CreateMessage();
    XmlDictionaryReader xdr = tmpMessage.GetReaderAtBodyContents();
    XmlDocument xdoc = new XmlDocument();
    xdoc.Load(xdr);
    xdr.Close();
    //transform the xmldocument
    XmlNamespaceManager nsmgr = new XmlNamespaceManager(xdoc.NameTable);
    nsmgr.AddNamespace("a", "urn:test:datacontracts");
    XmlNode node = xdoc.SelectSingleNode("//a:StringValue", nsmgr);
    if(node!= null) node.InnerText = "[Modified in SimpleMessageInspector]" + node.InnerText;
    MemoryStream ms = new MemoryStream();
    XmlWriter xw = XmlWriter.Create(ms);
    xdoc.Save(xw);
    xw.Flush();
    xw.Close();
    ms.Position = 0;
    XmlReader xr = XmlReader.Create(ms);
    //create new message from modified XML document
    newMessage = Message.CreateMessage(oldMessage.Version, null,xr );
    newMessage.Headers.CopyHeadersFrom(oldMessage);
    newMessage.Properties.CopyProperties(oldMessage.Properties);
    return newMessage;
}