Игнорировать недопустимые значения Enum в десериализации SOAP

Chris Berger спросил: 13 октября 2017 в 07:47 в: c#

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

[WebMethod]
public UserRole[] GetRoles(string token)

частичный wsdl:

  <s:simpleType name="UserRole">
    <s:restriction base="s:string">
      <s:enumeration value="Debug" />
      <s:enumeration value="EventEditor" />
      <s:enumeration value="InvoiceEntry" />
    </s:restriction>
  </s:simpleType>

(Потребитель компилируется с этим wsdl, но затем wsdl изменяется, и теперь разрешается новое значение - если это значение возвращается, исключение XML выбрасывается клиентом.)

Есть ли способ переопределить десериализацию SOAP для этого типа, чтобы я мог перехватить ошибку и либо удалить этот элемент из массива, либо заменить его значением по умолчанию? Если бы при этом использовался JSON вместо XML, я мог бы зарегистрировать JsonConverter для обработки этого типа, поэтому я думаю, что я ищу аналогичную глобальную функцию типа "RegisterConverter". Что я не думаю, что существует, но надеюсь на некоторую помощь ...

Любые средства украшения Enum с помощью атрибутов не будут работать, потому что весь код генерируется wsdl и регенерируется, когда веб ссылка обновлена. Обычно, если я хочу изменить класс, который был сгенерирован wsdl, я могу создать частичный класс, но это не работает для Enum. И даже не уверен, смогу ли я переопределить код XmlSerialization, даже если это был класс.



Дополнительный фон:

Это фактически реализовано как моя попытка динамический Enum. Wsdl генерируется из поиска в базе данных, так что я могу добавить дополнительные значения в базу данных, и приложение-потребитель получит доступ к разрешенным значениям без необходимости перекомпиляции веб-службы. Таким образом, я получаю intellisense и применение ограничений через тип enum, но возможность добавлять значения без тесной связи кода веб-сервиса и кода клиента. Проблема в том, что, если я добавлю новое значение, это создаст возможность сломать потребителей, которые не обновляются с новым wsdl ... Я бы предпочел просто игнорировать это значение, так как потребители не будут знать, что делать с в любом случае.

Расширение SOAP может быть способом исправить это (я знаю, как добавить расширение SOAP к самому WebService, но не знаю, как добавить его на стороне клиента ...) , но это не идеально, потому что я действительно хотел бы иметь общий способ легко справиться с этим, чтобы в моем коде было больше динамических перечислений (они не очень динамические, но идея в том, что значения проходят через средний уровень веб-службы без необходимости перекомпиляции этого среднего уровня). Что-то вроде "XmlSerialization.RegisterConverter (MyDynamicEnumType, DynamicEnum.Convert)" было бы идеально, где я могу определить универсальную функцию для использования и регистрации.)

0 ответов