7

我有一个场景,我需要使用 NetDataContractSerializer 而不是 DataContractSerializer。

到目前为止,我一直在使用这种方法 - http://www.pluralsight.com/community/blogs/aaron/archive/2006/04/21/22284.aspx - 这看起来很简单,但根据这个http:// social.msdn.microsoft.com/forums/en-US/wcf/thread/cb0c56c0-3016-4cda-a3c7-8826f8cc5bb0/方法不正确。

环顾四周,我发现了以下内容 - http://social.msdn.microsoft.com/forums/en-US/wcf/thread/f30ecd17-cac0-4cdc-8142-90b5f411936b/

基本上你需要运行以下命令:

所以这就是我在客户端所拥有的:

ChannelFactory<IPersonService> factory = new ChannelFactory<IPersonService>("WSHttpBinding_IPersonService");

foreach (OperationDescription desc in factory.Endpoint.Contract.Operations)
{
    DataContractSerializerOperationBehavior dcsOperationBehavior = desc.Behaviors.Find<DataContractSerializerOperationBehavior>();
    if (dcsOperationBehavior != null)
    {
        int idx = desc.Behaviors.IndexOf(dcsOperationBehavior);
        desc.Behaviors.Remove(dcsOperationBehavior);
        desc.Behaviors.Insert(idx, new NetDataContractSerializerOperationBehavior(desc));
        //return true;

    }       
}


IPersonService svc = factory.CreateChannel();

在服务器端:

myServiceHost = new ServiceHost(typeof(PersonService), baseAddress);


foreach (ServiceEndpoint endPoint in myServiceHost.Description.Endpoints)
{
    foreach (OperationDescription desc in endPoint.Contract.Operations)
    {
        DataContractSerializerOperationBehavior dcsOperationBehavior = desc.Behaviors.Find<DataContractSerializerOperationBehavior>();
        if (dcsOperationBehavior != null)
        {
            int idx = desc.Behaviors.IndexOf(dcsOperationBehavior);
            desc.Behaviors.Remove(dcsOperationBehavior);
            desc.Behaviors.Insert(idx, new NetDataContractSerializerOperationBehavior(desc));
            //return true;
        }
    }
}

myServiceHost.Open();

问题是我使用的是 VS 生成的客户端服务代理和标准的 VS .svc 服务。所以我不控制客户端代理或服务的创建,上面的代码假设了这一点。

帖子中的一条评论提到您将能够实现“IServiceBehavior,另一个是 IClientBehavior”,但我不知道如何着手使用上述代码并进行更改。有人有什么想法吗???

干杯安东尼

4

0 回答 0