首页 文章

WCF Guid DataMember未正确序列化

提问于
浏览
0

我有一个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 回答

  • 1

    事实证明,我的翻译层没有更新,无法在DTO之间进行转换! Whooooops!

  • 0

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

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

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

相关问题