Проблема передачи объекта между WCF и ASMX с использованием DataContracts - PullRequest
0 голосов
/ 17 марта 2011

Я пытаюсь использовать ASMX / WCF для передачи объектов между сайтами (публичными / частными).Я могу получить сериализованный объект из моей частной службы ASMX в мою общедоступную службу WCF, но не могу десериализовать объект.Приведенный ниже код сопровождается ошибкой.

Служба WCF, которая вызывает частную службу ASMX.

[WebGet(UriTemplate = "{part}")]
public Distributor GetDistributorInventory(string part)
{
    const string url = "http://www.site.com/service/lookup.asmx/StockCheck?part=" + part;
    //This is a wrapper for a HttpWebRequest that returns a string
    string results = WebHelper.HttpRequest("GET", "text/xml", null, url, new CookieContainer());  
    byte[] byteArray = Encoding.ASCII.GetBytes(results);
    MemoryStream stream = new MemoryStream(byteArray);
    DataContractSerializer deserialize = new DataContractSerializer(typeof(Distributor));
    return (Distributor)deserialize.ReadObject(stream);
}

Контракт, используемый в обеих государственных / частных службах

[DataContract(Namespace = "http://www.site.com/Services/", Name = "Inventory")]
public class Inventory
{
    [DataMember(Order = 1)]
    public string MPN{ get; set; }
    [DataMember(Order = 2)]
    public string DataSheetURL { get; set; }
    [DataMember(Order = 3)]
    public List<Distributor> Stock { get; set; }
}

[DataContract(Namespace = "http://www.site.com/Services/", Name = "Distributor")]
public class Distributor
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
    [DataMember(Order = 2)]
    public string Part { get; set; }
    [DataMember(Order = 3)]
    public int Quantity { get; set; }
    [DataMember(Order = 4)]
    public string URL { get; set; }
}

Сообщение об ошибке:

Ошибка в строке 1, позиция 166. Ожидается элемент «Распределитель» из пространства имен »http://www.site.com/Services/'.. Обнаружен« Элемент »с именем« Инвентаризация », пространство имен» http://www.site.com/Services/'.

Возможно, я полностью об этом расскажунеправильный путь, поэтому предложения о лучшем подходе (с образцом) будут очень благодарны.Моя конечная цель - передавать объекты между службами WCF и WCF или ASMX с использованием пользовательских объектов и DataContracts.

Ответы [ 3 ]

2 голосов
/ 17 марта 2011

Похоже, он пытается десериализоваться как Distributor, но ответ на вызов StockCheck возвращает Inventory.

0 голосов
/ 17 марта 2011

Вот окончательное решение, которое я нашел для выполнения этой работы, с наименьшим количеством работы.

  1. Я перешел от передачи своего объекта в виде XML в JSON (это была моя конечная цель, хотя я начал с XML)

  2. После получения моего объекта JSON я заметил, что у него есть оболочка «d:» и свойство «__type:», которое добавляется. Зная, что их нужно удалить, я решил найти общий способ удаления элементов.

  3. Мое общее решение состояло в том, чтобы использовать этот код / ​​статью на Codeplex , который имел методы расширения, которые выполняли очистку с использованием Reg Ex. Очень просто.

Вот мой полученный код:

[WebGet(UriTemplate = "{part}")]
public Distributor GetDistributorInventory(string part)
{
  const string url = "http://www.site.com/service/lookup.asmx/StockCheck";
  string results = WebHelper.HttpRequest("POST", "application/json; charset=utf-8", "{part: " + part + "}", url, new CookieContainer());

  Inventory inventory = new JavaScriptSerializer().CleanAndDeserialize<Inventory>(results);

  return inventory;
}

Еще одним преимуществом этого решения является возможность конвертировать объект независимо от пространства имен. В результате я могу использовать объект «sender.Inventory» в моей исходной службе ASMX и объект «receive.Inventory» в моей службе WCF, где я собираюсь использовать объект.

0 голосов
/ 17 марта 2011

Служба asmx, вероятно, не использует DataContractSerialiser. Вот короткое видео о том, как выполнить пользовательскую сериализацию в службе ASMX.

Или вы можете десериализовать в службе WCF, используя тот же сериализатор, что и служба asmx (XmlSerialiser?)

Другой вариант - использовать вместо этого сериализатор Json. Вот пример .

...