У меня есть служба 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(); }
}
}
}
I 'Мы установили часы на Guid в отладчике VS.Когда служба вызывается из клиентского веб-приложения, сгенерированный Guid является действительным Guid, который выглядит случайным шестнадцатеричным символом.Отлично, это работает.
Но когда данные сериализуются, проходят по проводам и выходят на другую сторону (в моем хранилище), Guid - это все нули!
У меня естьdouble, triple проверили, что Guid действительно отмечен атрибутом [DataMember].Мне интересно, вызывает ли дополнительный уровень DataContract (как FooDataContract заключен в контракт данных RequestWrapper) проблему сериализации?