我有一个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)导致序列化问题?
答案 0 :(得分:1)
我认为你的问题是你在DataContract类中创建的构造函数没有传递给客户端的代理。 WSDL对此不会有任何了解。将您的数据合同视为一个没有其他功能的数据粘贴的地方。要确认,您可以查看在添加服务引用时在客户端中生成的reference.cs类。
我建议重新编写代码,以便明确设置数据协定中的每个值,而不是依赖于构造函数。
您还可以编写具有所需行为的手动编码代理,然后与客户端共享该文件。这样可行,但随后您将更紧密地将客户与您的服务联系起来。
答案 1 :(得分:0)
事实证明,我的翻译层未更新以在DTO之间进行转换! Whooooops!