2016-01-28 13 views
5

Ich versuche, eine WCF-Anwendung zu erstellen, die auf Anforderungen von einem Lieferantensystem wartet. Der Lieferant hat mir eine WSDL zur Verfügung gestellt, also muss ich einen Dienst erstellen und ihnen seinen Endpunkt offen legen.WCF-Dienst + SvcUtil generiert unerwartete Objektstruktur

Ich habe SvcUtil.exe verwendet, um die C# -Klassen zu generieren, aber es gibt ziemlich seltsam aussehende Typen aus.

Dies ist ein Ausschnitt aus der WSDL, die mir gegeben wurde:

<?xml version="1.0" encoding="utf-8"?> 
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <wsdl:types> 
    <s:schema elementFormDefault="qualified"> 
     <s:element name="Submit"> 
     <s:complexType> 
      <s:sequence> 
      <s:element minOccurs="0" maxOccurs="1" name="Incident"> 
       <s:complexType> 
       <s:sequence> 
        <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="TransactionId" type="s:string" /> 
        <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="TransactionType" type="s:string" /> 
        <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="TransactionSubType" type="s:string" /> 
        <s:element minOccurs="0" maxOccurs="unbounded" form="unqualified" name="ConfigurationItem"> 
        <s:complexType> 
         <s:sequence> 
         <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="AssetTag" type="s:string" /> 
         <s:element minOccurs="0" maxOccurs="1" form="unqualified" name="Name" type="s:string" /> 
        .... 

Der Befehl, den ich laufen ist einfach

svcutil.exe file_name.wsdl 

Ich würde erwarten, dass dies eine Struktur wie folgt erstellt:

class Submit { ... } 
class Incident { ... } 
class ConfigurationItem { ... } 

So, wenn es serialisiert ist, bekomme ich etwas wie:

<Submit> 
    <Incident> 
     <TransactionId>12345</TransactionId> 
     <TransactionType>12345</TransactionType> 
     <TransactionSubType>12345</TransactionSubType> 
     <ConfigurationItem> 
      <AssetTag>xyz</AssetTag> 
      <Name>name</Name> 
     </ConfigurationItem> 
    </Incident> 
</Submit> 

Allerdings gibt die Ausgabe von SvcUtil.exe mir folgendes:

class SubmitIncident { ... } 
class SubmitIncidentConfigurationItem { ... } 

Es ist scheint auf einen Haufen legen die Reichen und die Ereignisobjekte in ein, und auch prepends es SubmitIncident 'auf jede die verschachtelten Elemente. Also, wenn die Serialisierung ich diese:

<SubmitIncident> 
    <TransactionId>...</TransactionId> 
    <TransactionType>...</TransactionType> 
    <TransactionSubType>...</TransactionSubType> 
    <SubmitIncidentConfigurationItem> 
     <AssetTag>...</AssetTag> 
     <Name>...</Name> 
    </SubmitIncidentConfigurationItem> 
</SubmitIncident> 

Dies verursacht Probleme sowohl mit dem Lieferanten (mein Dienst nicht ihre WSDL passen, so dass sie nicht mit mir reden können) und mit Weiterverarbeitung ich in der Anwendung täte . Kann mir jemand helfen, zu verstehen, warum das passiert, wie man es stoppt und SvcUtil zur korrekten Ausgabe bringt?

Antwort

1

Es stellt sich heraus, dass die Klassendefinitionen und Definitionen nicht wirklich das Problem sind (es verursacht später ein anderes Problem, aber das ist auch leicht auflösbar, sobald Sie verstehen, was los ist). Das Problem war in etwas verwurzelt, das ich in der Wegwerf-Entwicklungsphase gemacht hatte.

Die allererste Sache, die ich tat, war svcutil.exe zu verwenden, um die Serverklassen zu erzeugen, die die WSDL vom Lieferanten verwenden. Sobald ich genug hatte, um mit dem Debuggen/Testen zu beginnen, ging ich natürlich zum WCF Test Client und dem integrierten Entwicklungsserver von Visual Studio. Wenn der Client verwendet wurde, kam er mit allen möglichen unklaren Fehlern, z. https nicht unterstützt, Probleme mit Verträgen und Bindungen usw. Viele von ihnen wurden so Inkonsistenzen in der Konfiguration mit einem wenig googeln behoben wurden, aber unter dem Fehler war:

The operation is not supported in the WCF Test Client because it uses type SubmitIncident

Dies geschieht, wenn eine SubmitIncident Die Eigenschaften waren vom Typ object (auch wenn sie in anderen Eigenschaften tiefer verschachtelt sind). Im Grunde arbeitete ich nur an einem Fehler nach dem anderen und zog Teile heraus, die nicht funktionierten, bis es schließlich funktionierte. Hauptsächlich habe ich Attribute für Eigenschaften und Klassen hinzugefügt und entfernt, z. DataMember, SoapAction, Namespace usw.

Schließlich konnte ich erfolgreich die Endpunkte in der Anwendung mit dem WCF Test Client aufrufen. Wenn es jedoch zu anderen Anwendungen kam, die mit ihm kommunizierten, versagte es gemäß der ursprünglichen Frage. Die Änderungen, die ich vorgenommen habe, um es in dem WCF Test Client zu funktionieren, machten den Dienst ungültig für das ursprüngliche WSDL-Schema wirklich!

TL; DR;

Erstellen Sie Ihre WCF-Anwendungen nicht mit dem WCF-Testclient, um sie zu testen. Ich kann das nicht genug betonen. Es zwingt Sie, Dinge zu entfernen, die dazu führen, dass Ihre Anwendung bei normalem Gebrauch beschädigt wird. Verwenden Sie bereits in der frühen Entwicklungsphase eine Industriestandardanwendung wie SoapUI.

Nützliche Links

Verwandte Themen