WCF将对象添加为自定义标头

时间:2014-04-16 09:22:32

标签: c# wcf

我想将以下类添加为自定义标头。我的客户代码:

var obj = new Class1 { PropA = "A", PropB = "B" };
var header = AddressHeader.CreateAddressHeader("Class1", "Class1", obj);

var binding = new BasicHttpBinding();
var address = new EndpointAddress(new Uri(urlString), header);

ChannelFactory<TChannel>.CreateChannel(binding, address);


[DataContract]
public class Class1
{
    [DataMember]
    public string PropA { get; set; }

    [DataMember]
    public string PropB { get; set; }
}

我可以通过Fiddler看到我的标题。但是当我在服务端处理请求时,我可以获得消息头,但是头中的属性(PropA,PropB)等于null。

我的服务器端代码:

var obj = OperationContext.Current.IncomingMessageHeaders.GetHeader<Class1>("Class1", "Class1");

是否可以正确反序列化我的自定义标题?

感谢。

1 个答案:

答案 0 :(得分:1)

你的代码看起来很好所以我已经创建了示例应用程序,它可以按你的需要工作。请检查一下,也许你错过了真实代码......

class Program
{
    static void Main(string[] args)
    {
        string urlString = "http://localhost:8081/test";

        using (var host = new ServiceHost(typeof(Service), new Uri(urlString)))
        {
            host.AddDefaultEndpoints();
            host.Open();

            var obj = new Class1 { PropA = "A", PropB = "B" };
            var header = AddressHeader.CreateAddressHeader("Class1", "Class1", obj);

            var binding = new BasicHttpBinding();
            var address = new EndpointAddress(new Uri(urlString), header);

            var channel =  ChannelFactory<IService>.CreateChannel(binding, address);
            channel.DoWork();

            Console.ReadLine();
        }
    }
}

[DataContract]
class Class1
{
    [DataMember]
    public string PropA { get; set; }

    [DataMember]
    public string PropB { get; set; }
}

[ServiceContract]
interface IService
{
    [OperationContract]
    void DoWork();
}

class Service : IService
{
    public void DoWork()
    {
        var obj = OperationContext.Current.IncomingMessageHeaders.GetHeader<Class1>("Class1", "Class1");
        Console.WriteLine("PropA: " + obj.PropA);
        Console.WriteLine("PropB: " + obj.PropB);
    }
}

输出:

result