2008-08-04 11 views
20

Mein Dilemma ist im Grunde, wie Sie eine Aufzählung zwischen zwei Anwendungen teilen.So übergeben Sie aufgezählte Werte an einen Webdienst

Die Benutzer laden Dokumente über eine Front-End-Anwendung im Internet hoch. Diese Anwendung ruft einen Webdienst der Back-End-Anwendung auf und übergibt das Dokument an sie. Die Back-End-App speichert das Dokument und fügt eine Zeile in die Tabelle Dokument ein.

Der Dokumenttyp (7 möglich Dokumenttypen: Rechnung, Vertrag etc.) wird als Parameter an die Methode UploadDocument Web weitergegeben Service. Die Frage ist, was sollte der Typ (und mögliche Werte) dieses Parameters sein?

Da Sie diese Werte in beiden Anwendungen fest codieren müssen, denke ich, dass es O.K ist. einen beschreibenden String (Rechnung, Vertrag, Workorder, SignedWorkOrder) zu verwenden.

Ist es vielleicht ein besserer Ansatz, eine DocumentTypes Enumeration in der ersten Anwendung zu erstellen und sie auch in der zweiten Anwendung zu reproduzieren, und dann den entsprechenden ganzzahligen Wert an den Webdienst zwischen ihnen?

Antwort

3

Ich kann nur über .net sprechen, aber wenn Sie einen ASP.net-Webservice haben, sollten Sie in der Lage sein, eine Aufzählung direkt hinzuzufügen.

Wenn Sie dann mit dem „Add Web Reference“ in Ihrer Client-Anwendung soll die resultierende Klasse gehört, dass Enum

Aber das ist aus der Spitze von meinem Kopf, ich bin ziemlich sicher, dass ich es getan habe in der Vergangenheit, aber ich kann nicht sicher sagen.

+0

Die 'Add Web Reference' erstellt Enums, aber nur diejenigen, die in einer Methode referenziert werden. Ich kann der automatisch generierten Reference.cs-Datei manuell Enums hinzufügen und alles funktioniert gut. Vielleicht ist die andere Frage, aber ist es eine Möglichkeit, das ‚Add Web Reference‘ zu erhalten alle Aufzählungen in einer referenzierten Assembly hinzuzufügen (aber nicht im Code verwendet wird), ohne dass die Reference.cs-Datei manuell Hacking? –

+0

@Dave Web Services kapseln Methoden ein. Wenn es keine Methoden gibt, die eine Enum verwenden, hat es keinen Sinn - aus einer Web-Service-Perspektive - darauf zu verweisen. Ich empfehle Ihnen, eine separate Frage mit einer Beschreibung zu stellen, was Sie tun möchten/warum Sie eine unreferenzierte Redewendung darin haben wollen. –

6

Ich würde vorschlagen, eine ganze Zahl zwischen ihnen zu übergeben, nur aus Gründen der Lesbarkeit und Debugging. Angenommen, Sie gehen durch Ihre Protokolle und Sie sehen eine Reihe von 500 Fehlern für DocumentType = 4. Jetzt müssen Sie nachsehen, welcher DocumentType 4 ist. Oder wenn eine der Anwendungen auf eine Zahl verweist, die in der anderen nicht existiert, vielleicht aufgrund von nicht übereinstimmenden Versionen.

Es ist ein bisschen mehr Code, und es reibt die statische Typisierung Teil des Gehirns ein bisschen roh, aber in Protokolle über HTTP ist die empfangene Weisheit zu Seite mit lesbaren Strings über undurchsichtige Aufzählungen.

6

Ich würde noch interne Aufzählung verwenden, aber würde erwarten, dass Verbraucher mir nur den Namen, nicht den numerischen Wert selbst übergeben.

nur einige dumme Beispiel zu illustrieren:

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

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

In .NET Enumerationswerten sind (standardmäßig) in xml mit dem Namen serialisiert. In Fällen, in denen Sie mehrere Werte haben können (flags), wird ein Leerzeichen zwischen den Werten eingefügt. Dies funktioniert, weil die Enumeration keine Leerzeichen enthält. Sie können den Wert also erneut abrufen, indem Sie die Zeichenfolge aufteilen (z. B. "RechnungsvertragsigniertWorkOrder" unter Verwendung des Beispiels von lubos).

Sie können die Serialisierung von Werten in asp.net-Webdiensten mithilfe deroder mithilfe des EnumMember-Attributs bei der Verwendung von WCF steuern.

3

Wenn Sie Ihren Web-Service von einer .NET-Seite/-Anwendung aus verwenden, sollten Sie in der Lage sein, auf die Enumeration zuzugreifen, nachdem Sie Ihrem Projekt den Web-Verweis hinzugefügt haben.

0

Ich habe bemerkt, dass, wenn die Verwendung von „Add Service Reference“ im Gegensatz zu von VS.net „Webverweis hinzufügen“, die tatsächlichen ENUM-Werte sowie der Enum-Namen stoßen. Das ist wirklich ärgerlich, da ich sowohl 2.0 als auch 3.5 Clients unterstützen muss. Ich muss schließlich in den 2.0-generierten Web-Service-Proxy-Code gehen und manuell die Enum-Werte jedes Mal hinzufügen, wenn ich eine Änderung mache!

3

Wenn Sie nicht mit .NET zu .NET SOAP arbeiten, können Sie dennoch einen Enumerator definieren, sofern beide Endpunkte WSDL verwenden.

Es bis zu dem WSDL -> Proxy-Generator-Tool, um das in eine Enum-Entsprechung in der Client-Sprache zu analysieren.

2

Es gibt einige ziemlich gute Gründe dafür, enum s nicht an einer solchen Schnittstellengrenze zu verwenden. Betrachten Sie Dare's post zum Thema.