WCF Guid DataMember未正确序列化

时间:2011-11-02 15:24:03

标签: c# .net wcf serialization guid

我有一个WCF服务来回传递以下DataContracts:

[DataContract]
public class RequestWrapper
{
    [DataMember]
    public FooDataContract FooDataContract;
}

[DataContract]
public class ResponseWrapper
{
    [DataMember]
    public FooDataContract FooDataContract;
}

[DataContract]
public class FooDataContract
{
    public FooDataContract(string data, Guid id)
    {
        Data = data;
        ID = id;
    }

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

    [DataMember]
    public Guid ID { get; set; }
}

通过像这样的代理类来调用它:

void CallService(string data)
{
    var id = Guid.NewGuid();

    var response = proxy.CallService(new RequestWrapper
    {
        new FooDataContract(data, id);
    });
}

然后使用EF:

通过存储库将其传递(通过服务)到数据库
public void RepoMethod(FooDataContract foo)
{
    var guid = foo.ID; // - Breakpoint here shows all zeros!

    efContext.DoSomething(foo.Data, foo.ID);
}

这是服务电话:

public ResponseWrapper CallService(RequestWrapper request)
{
    var foo = request.FooDataContract;
    repository.RepoMethod(foo);

    var response = new ResponseWrapper{ FooDataContract = foo };
    return response;
}

这是代理:

public class Proxy : IMyService
{
    static readonly ChannelFactory<IMyService> channelFactory =
        new ChannelFactory<IMyService>("IMyService");

    ResponseWrapper CallService(RequestWrapper request)
    {
        return channelFactory.UseService(s => s.CallService(request));
    }
}

internal static class UseServiceFunction
{
    internal static R UseService<T, R>
            (this ChannelFactory<T> channelFactory, Func<T, R> useService)
    {
        var service = channelFactory.CreateChannel();
        try
        {
            R response = useService(service);
            return response;
        }
        finally
        {
            var channel = service as ICommunicationObject;
            try
            {
                if (channel.State != CommunicationState.Faulted) channel.Close();
            }
            catch { channel.Abort(); }
        }
    }
}

我在VS调试器中看了Guid。从客户端Web应用程序调用服务时,生成的Guid是看似随机的十六进制字符的有效Guid。太棒了,那很有用。

但是当数据被序列化时,通过电线,从另一侧出来(在我的存储库中),Guid全部为零!

我已经加倍,三重检查Guid确实标有[DataMember]属性。我想知道DataContract的额外层(如何使用RequestWrapper数据协定包装FooDataContract)导致序列化问题?

2 个答案:

答案 0 :(得分:1)

我认为你的问题是你在DataContract类中创建的构造函数没有传递给客户端的代理。 WSDL对此不会有任何了解。将您的数据合同视为一个没有其他功能的数据粘贴的地方。要确认,您可以查看在添加服务引用时在客户端中生成的reference.cs类。

我建议重新编写代码,以便明确设置数据协定中的每个值,而不是依赖于构造函数。

您还可以编写具有所需行为的手动编码代理,然后与客户端共享该文件。这样可行,但随后您将更紧密地将客户与您的服务联系起来。

答案 1 :(得分:0)

事实证明,我的翻译层未更新以在DTO之间进行转换! Whooooops!