WCF IClientMessageInspector.BeforeSendRequest 修改请求 [英] WCF IClientMessageInspector.BeforeSendRequest modify request

查看:23
本文介绍了WCF IClientMessageInspector.BeforeSendRequest 修改请求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to modify request in WCF service.

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 设置为请求的不同方式.

But i don't know what i can set in CreateMessage or maybe is different way to set my XML as request.

推荐答案

您可以通过一个 XmlReader 对象表示修改后的消息.下面是从文章 如何通过自定义 MessageInspector 检查和修改 WCF 消息.

You can pass an XmlReader object representing the modified message. Below is an example taken from the article How to inspect and modify WCF message via custom MessageInspector.

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;
}

这篇关于WCF IClientMessageInspector.BeforeSendRequest 修改请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆