에 잘못된 열거 값을 무시합니다. 새로운 값이 추가되고 그 값이 함수 호출에 의해 반환되면 웹 서비스의 소비자는 해당 enum 값을 신경 쓰지 않아도 예외를 throw합니다.내가 열거의 배열을 반환하는 ASP.NET 웹 서비스에의 WebMethod를 SOAP 직렬화 복원
[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 직렬화 복원을 오버라이드 (override) 할 수있는 방법이 있습니까? 이것이 XML 대신 JSON을 사용했다면 JsonConverter를 등록하여 해당 유형을 처리 할 수 있으므로 유사한 전역 "RegisterConverter"유형 함수를 찾고 있다고 생각합니다. 나는 존재하지 않는다고 생각하지만 어떤 도움을 원한다면 ...
모든 코드가 wsdl에 의해 생성되고 웹 참조가 업데이트 될 때 재생성되므로 속성이있는 열거 형을 장식하는 방법은 작동하지 않습니다 . 일반적으로 wsdl에 의해 생성 된 클래스를 수정하려는 경우 부분 클래스를 만들 수 있지만 Enum에는 작동하지 않습니다. 심지어 클래스 일지라도 XmlSerialization 코드를 재정의 할 수 있는지 여부는 확실하지 않습니다.
일부 추가 배경 :
이 실제로 동적 열거에 나의 시도로 구현됩니다. wsdl은 데이터베이스에 추가 값을 추가 할 수 있도록 데이터베이스 조회에서 생성되며 소비하는 응용 프로그램은 웹 서비스를 다시 컴파일 할 필요없이 허용 된 값에 액세스 할 수 있습니다. 이렇게하면 enum 유형을 통해 인텔리 센스 및 제약 조건 적용이 가능하지만 웹 서비스 코드와 클라이언트 코드를 긴밀하게 연결하지 않고도 값을 추가 할 수 있습니다. 문제는 새로운 값을 추가하면 새로운 wsdl로 업데이트되지 않은 소비자를 깰 가능성이 있다는 것입니다. 소비자는 그 값을 무시할 것입니다. 왜냐하면 소비자는 무엇을해야할지 모르기 때문입니다. 어쨌든.
SOAP 확장은 SOAP 확장을 WebService 자체에 추가하는 방법을 알고 있지만 클라이언트 측에 SOAP 확장을 추가하는 방법을 알고 있습니다. 그러나 SOAP 확장은 다음과 같은 이유로 적합하지 않습니다. 나는 이것을 쉽게 처리 할 수있는 일반적인 방법을 원한다. 그래서 나는 동적 인 enum을 코드에 넣을 수있다. (동적 인 것은 아니지만 아이디어는 값이 webservice의 중간 레이어를 통과하지 않아도된다. 그 중간 계층을 다시 컴파일하십시오). "XmlSerialization.RegisterConverter (MyDynamicEnumType, DynamicEnum.Convert)"와 같은 것이 가장 이상적입니다.
음, 두 가지 가능한 해결책을 생각했습니다. 하나는 (부분 클래스에서) WebService 선언에서 GetReaderForMessage를 재정의 한 다음 열거 형 이름과 값에 대해 Regex 일치를 수행하고 다른 하나는 허용 가능한 값 목록을 웹 서비스에 보내고 웹 서비스가 보내지 않기를 요청하는 것입니다. 그 목록에없는 값. 그것들은 모두 빨고, 나는 지금까지 얻은 것보다 더 나은 대답을 누군가가 얻을 수 있기를 바라고있다. 그렇지 않다면 나는 내일 내 자신의 janky 대답을 올릴 것이다. –
글쎄, 나는 GetReaderForMessage를 무시하는 것을 끝내었지만 정규 표현식보다 열거 이름의 전체 메시지 문자열을 일치시키는 것이 더 좋았다. 열거 형의 deserialization을 재정의하는 더 나은 방법이 필요했다. –
WSDL과 XSD의 요점은 서비스와 클라이언트 사이에 계약을 맺는 것입니다.이 계약을 위반하기 위해 뭔가를 구현하고 있습니다. 다른 구현을 재고해야합니까? 또는 열거 형 대신 다른 것을 허용하도록 WSDL을 변경하십시오. –