【问题标题】:WCF Guid DataMember not Serialized properlyWCF Guid DataMember 未正确序列化
【发布时间】:2011-12-20 10:29:13
【问题描述】:

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

[数据合约] 公共类 RequestWrapper { [数据成员] 公共 FooDataContract FooDataContract; } [数据合约] 公共类 ResponseWrapper { [数据成员] 公共 FooDataContract FooDataContract; } [数据合约] 公共类 FooDataContract { 公共 FooDataContract(字符串数据,Guid id) { 数据=数据; 身份证=身份证; } [数据成员] 公共字符串数据 { 获取;放; } [数据成员] 公共指导 ID { 获取;放; } }

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

无效呼叫服务(字符串数据) { var id = Guid.NewGuid(); var response = proxy.CallService(new RequestWrapper { 新的 FooDataContract(数据,ID); }); }

然后使用 EF 通过存储库将其传递(通过服务)到数据库:

公共无效回购方法(FooDataContract foo) { var guid = foo.ID; // - 这里的断点显示全零! efContext.DoSomething(foo.Data, foo.ID); }

这是服务调用:

公共 ResponseWrapper CallService(RequestWrapper 请求) { var foo = request.FooDataContract; 存储库.RepoMethod(foo); var response = new ResponseWrapper{ FooDataContract = foo }; 返回响应; }

这是代理:

公共类代理:IMyService { 静态只读 ChannelFactory channelFactory = 新 ChannelFactory("IMyService"); ResponseWrapper CallService(RequestWrapper 请求) { 返回 channelFactory.UseService(s => s.CallService(request)); } } 内部静态类 UseServiceFunction { 内部静态 R UseService (这个 ChannelFactory channelFactory, Func useService) { var service = channelFactory.CreateChannel(); 尝试 { R响应=使用服务(服务); 返回响应; } 最后 { var channel = 作为 ICommunicationObject 的服务; 尝试 { if (channel.State != CommunicationState.Faulted) channel.Close(); } 赶上{频道。中止(); } } } }

我已经在 VS 调试器中监视了 Guid。当从客户端 Web 应用程序调用服务时,生成的 Guid 是看似随机的十六进制字符的有效 Guid。太好了,这行得通。

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

我已经两次、三次检查 Guid 是否确实标记有 [DataMember] 属性。我想知道 DataContract 的额外层(如何用 RequestWrapper 数据合约包装 FooDataContract)是否会导致序列化问题?

【问题讨论】:

  • 能否提供您的 WCF 服务中调用 repo 方法的代码?

标签: c# .net wcf serialization guid


【解决方案1】:

事实证明,我的翻译层没有更新为在 DTO 之间进行转换!哎呀!

【讨论】:

    【解决方案2】:

    我认为您的问题是您在 DataContract 类中创建的构造函数没有传递给客户端的代理。 WSDL 对此一无所知。将您的数据合约视为仅存储数据而没有其他功能的地方。要确认,您可以查看添加服务引用时在客户端生成的 reference.cs 类。

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

    您还可以编写具有您想要的任何行为的手动编码代理,然后与客户端共享该文件。这会行得通,但是你会更紧密地将你的客户端与你的服务耦合。

    【讨论】:

    • 你能分享一下你代理的相关部分吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2020-10-14
    相关资源
    最近更新 更多