Как передать перечисляемые значения в веб-сервис - PullRequest
20 голосов
/ 05 августа 2008

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

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

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

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

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

Ответы [ 8 ]

5 голосов
/ 05 августа 2008

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

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

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

[WebMethod]
public void UploadDocument(string type, byte[] data)
{
  DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}
5 голосов
/ 05 августа 2008

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

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

3 голосов
/ 08 сентября 2008

Если вы не работаете с .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 Generator, чтобы разобрать это в эквивалентный enum на языке клиента.

3 голосов
/ 05 августа 2008

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

3 голосов
/ 05 августа 2008

В .NET значения перечисления (по умолчанию) сериализуются в xml с именем. Для случаев, когда вы можете иметь несколько значений ( flags ), тогда между значениями будет помещен пробел. Это работает, потому что перечисление не содержит пробелов, поэтому вы можете получить значение снова, разделив строку (например, «Invoice Contract SignedWorkOrder», используя пример lubos).

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

3 голосов
/ 05 августа 2008

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

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

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

2 голосов
/ 08 сентября 2008

Есть несколько довольно веских причин не использовать enum s на такой границе интерфейса. Рассмотрим пост Дейра на эту тему.

0 голосов
/ 08 сентября 2008

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

...