ASMX Использовать скомпилированный тип вместо сгенерированного типа для SoapHeader - PullRequest
0 голосов
/ 06 декабря 2010

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

У меня есть веб-служба ASMX и клиент, а также общая библиотека DLL.В shared.dll у меня есть сериализуемый тип, назовем его CustomHeader, производный от SoapHeader.Есть веб-метод, который принимает это как ввод через атрибут SoapHeader, поэтому мой сервис выглядит так:

[WebService]
public class MyService : WebService {
    public CustomHeader MyCustomHeader { get; set; }

    [WebMethod]
    [SoapHeader("MyCustomHeader", Direction = SoapHeaderDirection.In)]
    public void Go() { }
}

Пока все хорошо.Внутри метода Go () я могу получить доступ к объекту MyCustomHeader и что-то с ним делать.На клиенте, когда я генерирую прокси, сгенерированный код включает в себя класс CustomHeader, содержащий свойства данных объекта MyService, и свойство CustomHeaderValue, которое я могу установить на клиенте перед выполнением вызова службы Go (), ион передает его очень хорошо.

Проблема заключается в том, что оригинальный класс CustomHeader имел конструкторы и методы, которые помогали заполнять поля данных (хэш-функции, вычисляемые значения и т. д.).Поскольку у клиента есть ссылка на общую библиотеку, он может создать экземпляр исходного класса CustomHeader, но не может использовать этот объект в вызове службы, поскольку это технически другой тип.

IМожно придумать несколько способов справиться с этим:

1) Преобразуйте объект CustomHeader в сгенерированный класс CustomHeader, перетягивая свойства по одному за раз.Это не будет большой обработкой, но это будет означать, что мне нужно либо использовать отражение для циклического перебора свойств, либо касаться кода преобразования при каждом изменении класса CustomHeader.

2) Сериализация объекта CustomHeaderзатем десериализовать его в сгенерированный класс CustomHeader - поскольку они действительно идентичны, кроме конструкторов и методов, сериализация должна работать очень хорошо.Это был бы самый простой способ, но он требует дополнительного цикла сериализации / десериализации, который, хотя и не очень дорогой, все же является дополнительной обработкой.

3) Измените сгенерированный код, чтобы сделать свойство CustomHeaderValue моего общего ресурсатип вместо сгенерированного типа.Мое мнение таково, что это ужасный способ ведения дел, но, вероятно, он будет наименее дорогим из этих вариантов.Я не собираюсь делать эту опцию, но я просто хотел выпустить ее, поскольку технически она будет работать.

Я что-то упустил?Есть ли принятый шаблон для этого?

Спасибо за помощь.

1 Ответ

2 голосов
/ 06 декабря 2010

Веб-службы ASMX не поддерживают повторное использование типов между клиентом и службой.

WCF поддерживает это.

...