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