WCF Guid DataMember неправильно сериализован - PullRequest
0 голосов
/ 02 ноября 2011

У меня есть служба 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) проблему сериализации?

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

Я думаю, что ваша проблема здесь в том, что конструктор, который вы создали в своем классе DataContract, не передается прокси на стороне клиента.WSDL ничего об этом не узнает.Думайте о своих контрактах на данные как о месте, где можно хранить данные без какой-либо другой функциональности.Для подтверждения вы можете посмотреть в классе reference.cs, сгенерированном в клиенте при добавлении ссылки на службу.

Я бы предложил переписать код, чтобы вы явно установили каждое из значений вваш контракт с данными вместо того, чтобы полагаться на конструктор.

Вы также можете написать прокси-код с ручным кодом, который будет работать по вашему желанию, а затем поделиться этим файлом с клиентом.Это бы сработало, но тогда вы будете более тесно связывать своего клиента с вашим сервисом.

0 голосов
/ 11 ноября 2011

Оказывается, мой уровень перевода не был обновлен для преобразования между DTO! Whooooops!

...