【问题标题】:Need example on implementing MessageHeaders.WriteHeaderContents需要实现 MessageHeaders.WriteHeaderContents 的示例
【发布时间】:2011-08-22 00:03:23
【问题描述】:

我有一个自定义标头存储在“字符串”变量中,我需要将来自 WCF 客户端的传出 SOAP 请求的标头替换为“字符串”类型变量中的标头。根据研究,我发现实现 MessageHeaders.WriteHeaderContents 可以工作,但此方法仅接受 XmlDictionaryWriterXmlWriter 类型作为输入。我有一个字符串输入。我如何在 C# 中编码..

【问题讨论】:

    标签: c# wcf c#-4.0 c#-3.0


    【解决方案1】:

    消息头是一个 SOAP 概念,而 SOAP 请求是 XML 文档,因此您确实需要一些 XML 特性。但是对于您的场景,您实际上不需要覆盖MessageHeaders,您可以使用检查器并在该点简单地替换标题,如下例所示(转换为XML将由MessageHeader完成类)。

    public class StackOverflow_7141998
    {
        [MessageContract]
        public class MyMC
        {
            [MessageHeader(Name = "MyHeader", Namespace = "http://my.namespace.com")]
            public string HeaderValue { get; set; }
            [MessageBodyMember(Name = "MyBody", Namespace = "http://my.namespace.com")]
            public string BodyValue { get; set; }
        }
        [ServiceContract]
        public interface ITest
        {
            [OperationContract]
            void Process(MyMC mc);
        }
        public class Service : ITest
        {
            public void Process(MyMC mc)
            {
                Console.WriteLine("Header value: {0}", mc.HeaderValue);
            }
        }
        public class MyInspector : IEndpointBehavior, IClientMessageInspector
        {
            public string NewHeaderValue { get; set; }
    
            public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
            {
            }
    
            public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
            {
                clientRuntime.MessageInspectors.Add(this);
            }
    
            public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
            {
            }
    
            public void Validate(ServiceEndpoint endpoint)
            {
            }
    
            public void AfterReceiveReply(ref Message reply, object correlationState)
            {
            }
    
            public object BeforeSendRequest(ref Message request, IClientChannel channel)
            {
                int originalIndex = request.Headers.FindHeader("MyHeader", "http://my.namespace.com");
                if (originalIndex >= 0)
                {
                    request.Headers.Insert(originalIndex, MessageHeader.CreateHeader("MyHeader", "http://my.namespace.com", this.NewHeaderValue));
                    request.Headers.RemoveAt(originalIndex + 1);
                }
    
                return null;
            }
        }
        public static void Test()
        {
            string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
            ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));
            ServiceEndpoint endpoint = host.AddServiceEndpoint(typeof(ITest), new WSHttpBinding(), "");
            host.Open();
            Console.WriteLine("Host opened");
    
            ChannelFactory<ITest> factory = new ChannelFactory<ITest>(new WSHttpBinding(), new EndpointAddress(baseAddress));
            MyInspector inspector = new MyInspector { NewHeaderValue = "Modified header value" };
            factory.Endpoint.Behaviors.Add(inspector);
            ITest proxy = factory.CreateChannel();
    
            proxy.Process(new MyMC { HeaderValue = "Original header value", BodyValue = "The body" });
    
            ((IClientChannel)proxy).Close();
            factory.Close();
    
            Console.Write("Press ENTER to close the host");
            Console.ReadLine();
            host.Close();
        }
    }
    

    【讨论】:

    • 我看到您在测试中创建了一个端点变量,但您没有使用它。这个变量的目的是什么?
    • 在这种情况下,不需要 - 我有一个模板用于我发布的许多 WCF 示例,有时我们需要配置端点(例如通过添加行为) .在这种情况下,我只是忘了删除声明。
    猜你喜欢
    • 2019-12-11
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多