Десериализация WCF DataContract отсутствует 3 строковых поля даже с установленным Order - PullRequest
0 голосов
/ 25 ноября 2010

У меня есть служба, которая получает данные от прокси-сервера, размещенного в WebApp.DataMembers установлены с Order = *, и я также попытался добавить isRequired = true.Проблема состоит в том, что из 60 полей информации, сериализованных и десериализованных, одни и те же 3 строковых поля постоянно отсутствуют (ноль).Я запустил отладку, которая показывает мне, что данные передаются из браузера клиента в прокси-службу без изменений (сериализовано из JSON).Затем прокси-служба отправляет его в службу Windows, где после десериализации отсутствуют 3 поля.

Я пытался установить порядок полей по-другому, но, похоже, ничего не работает.Это всегда одни и те же 3 пропущенных поля простых строк, часто не длиннее 10-20 символов.Стоит также отметить, что эти проблемные DataMembers правильно заполнены во всех других областях программы.

Код службы прокси выглядит следующим образом:

 public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo)
    {
        MyService.MyServiceClient proxy = new MyService.MyServiceClient("WSHttpBinding_IMyService");
        proxy.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;
        TransactionResult result = proxy.Update(obj, ItemOne, ItemTwo);
        proxy.Close();
        return result;
    }

Код службы Windows

[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo)
{obj is missing same 3 values at this point...}

Пример одного из DataMembers объекта

[DataMember(Order = 56)]
    public String ItemTwo
    {
        get
        {
            ...
        }
        set
        {
            ...
        }
    }

Ответы [ 2 ]

0 голосов
/ 25 ноября 2010

Можно проверить, что дополнительные параметры в сигнатуре имеют те же имена, что и свойства вашей сущности.

Почему бы не переименовать параметры подписи (не забудьте восстановить свою справочную службу клиента / прокси-сервер)

public TransactionResult Update(MyObj obj, String ItemOne, String ItemTwo)

до

public TransactionResult Update(MyObj obj, String NewItemOne, String NewItemTwo)
0 голосов
/ 25 ноября 2010

Идеи:

  • убедитесь, что эти поля не вычисляются (и, следовательно, сбрасываются или изменяются в вашем коде, в зависимости от порядка десериализации)
  • убедитесь, что вы не определяете атрибут DefaultValue, поскольку сериализация использует его для оптимизации полосы пропускания
  • убедитесь, что вы не объявляете какое-то пользовательское поведение, которое взламывает эти поля
  • попробуйте другую привязку WCF (HTTP, NETTCP, ...)
  • перехватывает события OnDeserialized, OnDeserializing и проверяет наличие данных
...