Как передать перечислимые значения веб-сервису

StackOverflow https://stackoverflow.com/questions/1709

Вопрос

По сути, моя дилемма заключается в том, как разделить перечисление между двумя приложениями.

Пользователи загружают документы через интерфейсное приложение, расположенное в Интернете.Это приложение вызывает веб-службу серверного приложения и передает ему документ.Серверное приложение сохраняет документ и вставляет строку в Документ стол.

Тип документа (7 возможных типов документов: Счет, Договор и т. д.) передается в качестве параметра веб-службе Загрузить документ метод.Вопрос в том, каким должен быть тип (и возможные значения) этого параметра?

Поскольку вам нужно жестко запрограммировать эти значения в обоих приложениях, я думаю, это нормально.использовать описательную строку (Счет, Договор, Заказ на работу, SignedWorkOrder).

Может быть, это лучший подход к созданию Типы документов перечисление в первом приложении и воспроизвести его также во втором приложении, а затем передать между ними соответствующее целочисленное значение веб-службе?

Это было полезно?

Решение

Я могу говорить только о .net, но если у вас есть веб-сервис ASP.net, вы сможете добавить перечисление непосредственно к нему.

Когда вы затем используете «Добавить веб-ссылку» в своем клиентском приложении, полученный класс должен включать это перечисление.

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

Другие советы

Я бы посоветовал не передавать между ними целое число просто в целях удобства чтения и отладки.Допустим, вы просматриваете журналы и видите группу из 500 ошибок для DocumentType=4.Теперь вам нужно посмотреть, какой тип документа равен 4.Или если одно из приложений ссылается на номер, которого нет в другом, возможно, из-за несовпадения версий.

Это немного больше кода, и он немного натирает часть мозга, связанную со статической типизацией, но в протоколах поверх HTTP общепринятая мудрость заключается в том, чтобы отдавать предпочтение разборчивым строкам над непрозрачными перечислениями.

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

просто глупый пример для иллюстрации:

public enum DocumentType
{
  Invoice,
  Contract,
  WorkOrder,
  SignedWorkOrder
}

[WebMethod]
public void UploadDocument(string type, byte[] data)
{
  DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}

В .NET значения перечисления (по умолчанию) сериализуются в XML с именем.В тех случаях, когда вы можете иметь несколько значений (флаги), затем между значениями помещается пробел.Это работает, поскольку перечисление не содержит пробелов, поэтому вы можете получить значение снова, разделив строку (т.«Контракт на выставление счета SignedWorkOrder», на примере Любоса).

Вы можете управлять сериализацией значений в веб-службах asp.net, используя Ксмленуматтрибуте, или с помощью EnumMember атрибут при использовании WCF.

Если вы используете свой веб-сервис со страницы/приложения .NET, вы сможете получить доступ к перечислению после добавления веб-ссылки в проект, который использует этот сервис.

Если вы не работаете с .NET на .NET SOAP, вы все равно можете определить перечислитель при условии, что обе конечные точки используют WSDL.

<s:simpleType name="MyEnum">    
     <s:restriction base="s:string">
          <s:enumeration value="Wow"/>
          <s:enumeration value="This"/>
          <s:enumeration value="Is"/>
          <s:enumeration value="Really"/>
          <s:enumeration value="Simple"/>
     </s:restriction>
</s:simpleType>

Инструмент генератора WSDL -> Proxy должен проанализировать это в эквивалент перечисления на клиентском языке.

Есть несколько довольно веских причин не использовать enums на такой границе интерфейса.Учитывать Сообщение Дэйра на предмет.

Я заметил, что при использовании «Добавить ссылку на службу» вместо «Добавить веб-ссылку» из VS.net встречаются фактические значения перечисления, а также имена перечислений.Это действительно раздражает, поскольку мне нужно поддерживать клиентов как 2.0, так и 3.5.В конечном итоге мне приходится заходить в код прокси-сервера веб-службы, сгенерированный версией 2.0, и вручную добавлять значения перечисления каждый раз, когда я вношу изменения!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top