Instance Validierungsfehler: ‚2‘ ist kein gültiger Wert für querytype. (Internetservice)

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

  •  07-07-2019
  •  | 
  •  

Frage

Ich habe einen Web-Service, den ich eine ENUM bin vorbei

public enum QueryType {
    Inquiry = 1
    Maintainence = 2
}

Wenn ich ein Objekt übergeben, die einen Parameter von querytype auf sie hat, erhalte ich den Fehler wieder aus dem Web-Service zu sagen:

  

'2' ist kein gültiger Wert für querytype

, wenn Sie sich deutlich von der Erklärung des Enum sehen können, dass es ist.

Ich kann nicht die Werte der Enumeration ändern, weil Legacy-Anwendungen, die Werte zu verwenden, aber ich würde lieber nicht „default“ Wert einfügen muß nur den Index der Enumeration zu drücken, um es mit meinem Web-Service zu arbeiten. Es wirkt wie der Webdienst den Index der Werte und nicht die Werte selbst verwenden.

Hat jemand einen Vorschlag, was ich tun kann, damit es funktioniert, ist es etwas, was ich in meinem WSDL ändern?

War es hilfreich?

Lösung

Ich nehme an, Sie asmx Web-Services für diese Antwort verwenden.

Ihre Vermutung ist richtig - der XML-Serializer der Aufzählungs Namen in der WSDL und nicht den Wert verwendet

.

Wenn Sie an Ihrem WSDL aussehen es so etwas wie folgt aussehen:

<s:simpleType name="QueryType">
  <s:restriction base="s:string">
    <s:enumeration value="Inquiry" /> 
    <s:enumeration value="Maintainence" /> 
  </s:restriction>
</s:simpleType>


Also, wenn Sie den Dienst aufrufen es eine Zeichenfolge erwartet, dass der Name des Enumerationsmember ist. Wenn Sie einen .NET-Proxy verwenden, wird diese Umwandlung in der Regel für Sie behandelt. Wenn ein Wert an den Dienst übergeben wird, die nicht in den ENUM-Wert deserialisiert werden kann, werden Sie die Meldung erhalten, dass Sie sehen.

Um dies zu umgehen, können Sie sicherstellen, dass Sie es mit dem erwarteten Wert senden oder, wenn das nicht für Sie arbeiten, können Sie die XML-Serializer sagen, welche Werte Sie verwenden möchten. Sie können dies tun, um das XmlEnum Attribut:

public enum QueryType 
{
    [XmlEnum("1")]
    Inquiry = 1,
    [XmlEnum("2")]
    Maintainence = 2
}


Dies wird das folgende Schema-Fragment (aus dem WSDL) erzeugen:

<s:simpleType name="QueryType">
  <s:restriction base="s:string">
    <s:enumeration value="1" /> 
    <s:enumeration value="2" /> 
  </s:restriction>
</s:simpleType>


Dann, wenn Sie den Wert „2“ in den Dienst übertragenen dann sollte es richtig sein deserialisiert, aber sie verlieren die Bedeutung der Enumerationswerte.

Andere Tipps

Versuchen Sie, die Flags() Attribut auf die querytype Definition hinzugefügt wird.

Etwas zu prüfen ist, um sicherzustellen, dass Sie Ihre ENUM-Werte initialisieren und nicht das erste Element übernehmen aus der Liste verwendet werden.

Zum Beispiel kann eine Enumeration definiert, die nicht an dem int-Wert von 0, wie dies nicht gestartet:

 public enum EnumCategoryID
        {
            TOOTH_PASTE = 1,
            TOOTH_BRUSHES = 2,
            HOT_BEVERAGES = 3,
            ENERGY_DRINKS = 4,
            OVER_THE_COUNTER = 5,
            IN_STORE = 6
        }

Normalerweise, wenn Sie Ihre Enum-Instanz erklären Sie könnten versucht sein, dies zu tun:

EnumCategoryID anID; //Assuming the value will be 'TOOTH_PASTE' when used

Wenn die Datenstruktur, die Sie durch den Webservice zurückgeben eine Enum-Variable muss es angebracht Sie die Instanz-Fehlermeldung, wenn von außerhalb des Webservice aufgerufen (aber wenn Sie die Dataclass aus dem Webservice verwenden, werden Sie keine Fehler haben).

Punkt ist, nur sicher sein, dass Sie richtig Ihre Enum-Instanz initialisiert haben, dass Sie in dem Webservice zurückkehren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top