Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF Guid数据成员未正确序列化_C#_.net_Wcf_Serialization_Guid - Fatal编程技术网

C# WCF Guid数据成员未正确序列化

C# WCF Guid数据成员未正确序列化,c#,.net,wcf,serialization,guid,C#,.net,Wcf,Serialization,Guid,我有一个WCF服务,它来回传递以下数据契约: [DataContract] public class RequestWrapper { [DataMember] public FooDataContract FooDataContract; } [DataContract] public class ResponseWrapper { [DataMember] public FooDataContract FooDataContract; } [DataCon

我有一个WCF服务,它来回传递以下数据契约:

[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; } } [数据合同] 公共类请求包装器 { [数据成员] 公共食品合同; } [数据合同] 公共类响应包装器 { [数据成员] 公共食品合同; } [数据合同] 公共类FooDataContract { 公共FooDataContract(字符串数据,Guid id) { 数据=数据; ID=ID; } [数据成员] 公共字符串数据{get;set;} [数据成员] 公共Guid ID{get;set;} } 它是通过如下代理类调用的:

void CallService(string data) { var id = Guid.NewGuid(); var response = proxy.CallService(new RequestWrapper { new FooDataContract(data, id); }); } void CallService(字符串数据) { var id=Guid.NewGuid(); var response=proxy.CallService(新的RequestWrapper { 新的FooDataContract(数据,id); }); } 然后使用EF通过存储库(通过服务)将其传递到数据库:

public void RepoMethod(FooDataContract foo) { var guid = foo.ID; // - Breakpoint here shows all zeros! efContext.DoSomething(foo.Data, foo.ID); } 公共无效报告方法(FooDataContract foo) { var guid=foo.ID;//-此处的断点显示所有零! 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; } 公共响应包装调用服务(请求包装请求) { var foo=request.FooDataContract; repository.repo方法(foo); var response=newresponsewrapper{FooDataContract=foo}; 返回响应; } 这是代理:

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(); } } } } 公共类代理:IMyService { 静态只读通道工厂通道工厂= 新渠道工厂(“IMyService”); ResponseWrapper调用服务(RequestWrapper请求) { 返回channelFactory.UseService(s=>s.CallService(request)); } } 内部静态类UseServiceFunction { 内部静态用户服务 (此通道工厂,Func useService) { var service=channelFactory.CreateChannel(); 尝试 { R响应=使用服务(服务); 返回响应; } 最后 { var通道=作为ICommunicationObject的服务; 尝试 { 如果(channel.State!=CommunicationState.Faulted)channel.Close(); } catch{channel.Abort();} } } } 我在VS调试器的Guid上放了一个手表。从客户端web应用程序调用服务时,生成的Guid是看似随机的十六进制字符的有效Guid。太好了,这很有效

但是,当数据被序列化、传输到另一端(在我的存储库中)时,Guid都是零


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

我认为您的问题在于您在DataContract类中创建的构造函数没有传递到客户端的代理。WSDL对此一无所知。将您的数据契约视为一个不需要其他功能就可以粘贴数据的地方。要确认,您可以查看添加服务引用时在客户端中生成的reference.cs类

我建议重新编写代码,以便在数据契约中显式设置每个值,而不是依赖构造函数


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

结果是,我的翻译层没有更新为在DTO之间转换!哇

您能否在WCF服务中提供调用repo方法的代码?您能否共享代理的相关部分?