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

C# WCF将对象添加为自定义标头,c#,wcf,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); C

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

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; }
}
var obj=newclass1{PropA=“A”,PropB=“B”};
var header=AddressHeader.CreateAddressHeader(“Class1”、“Class1”、obj);
var binding=新的BasicHttpBinding();
var address=新端点地址(新Uri(urlString),头);
CreateChannel(绑定,地址);
[数据合同]
公共班级1
{
[数据成员]
公共字符串PropA{get;set;}
[数据成员]
公共字符串PropB{get;set;}
}
我可以通过Fiddler看到我的标题。但当我在服务端处理请求时,我可以得到消息头,但头中的属性(PropA,PropB)等于null

我的服务器端代码:

var obj = OperationContext.Current.IncomingMessageHeaders.GetHeader<Class1>("Class1", "Class1");
var obj=OperationContext.Current.IncomingMessageHeaders.GetHeader(“Class1”、“Class1”);
是否可以正确反序列化我的自定义标头


谢谢。

您的代码看起来很好,所以我创建了示例应用程序,它可以按照您的需要工作。请检查一下,也许你在真正的代码中遗漏了什么

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);
    }
}
类程序
{
静态void Main(字符串[]参数)
{
字符串URL字符串=”http://localhost:8081/test";
使用(var-host=new-ServiceHost(typeof(Service),new-Uri(urlString)))
{
AddDefaultEndpoints();
host.Open();
var obj=newclass1{PropA=“A”,PropB=“B”};
var header=AddressHeader.CreateAddressHeader(“Class1”、“Class1”、obj);
var binding=新的BasicHttpBinding();
var address=新端点地址(新Uri(urlString),头);
var channel=ChannelFactory.CreateChannel(绑定,地址);
道工();
Console.ReadLine();
}
}
}
[数据合同]
一班
{
[数据成员]
公共字符串PropA{get;set;}
[数据成员]
公共字符串PropB{get;set;}
}
[服务合同]
接口设备
{
[经营合同]
无效销钉();
}
班级服务:IService
{
公共工作
{
var obj=OperationContext.Current.IncomingMessageHeaders.GetHeader(“Class1”、“Class1”);
控制台写入线(“PropA:+obj.PropA”);
控制台写入线(“PropB:+obj.PropB”);
}
}
输出:


我正在使用控制台应用程序进行托管。也许,这就是问题所在。我将用不同的标题发送我的所有属性。谢谢