2009-06-15 5 views
4

Ich versuche, einen ASP.Net-Webdienst in WCF-Anwendung zu konvertieren. Der Client ist auf dem .Net Compact Framework, das WCF nicht unterstützt, also muss ich sicherstellen, dass der WCF weiterhin ASP-Webservices unterstützt. Wenn ich die Webdienst-Referenz in Visual Studio hinzufüge, haben die Methoden der generierten Proxy-Klasse zusätzliche Argumente.Warum gibt es zusätzliche Argumente in meiner Web-Service-Referenz?

Zum Beispiel, wenn ein Verfahren, wie definiert:

public void GetEmpInfo(int empNo) 

Diese Methode in der Proxy-Klasse erscheint:

public void GetEmpInfo(int empNo, bool empNoSpecified) 

Was bewirkt dies, und wie bekomme ich es zu stoppen?

Antwort

8

Schauen Sie sich diese blog post ...

Wo haben diese zusätzlichen boolean „angegeben“ Mitglieder kommen und was tun sie? Die Antwort ist das Schema , das der WCF-Datenvertrag Serializer standardmäßig generiert. Aufgrund der Art und Weise sein Versionierungsmodell funktioniert, der Serializer generiert alle Datenelemente als optionale Elemente. Der ältere Web Dienstestapel, ASP.NET-Webdienste ("ASMX") verwendet einen anderen Serializer der XmlSerializer, der vollständige Schema und XML-Treue verwaltet. Die XmlSerializer bildet alle optionalen Elemente auf zwei Mitglieder: ein die Daten selbst darstellt, und ein gibt an, ob oder nicht die Daten tatsächlich vorhanden - das ist das „xxxSpecified“ Mitglied. Diese xxxSpecified Mitglieder müssen true gesetzt werden, um die Serialisierung der die entsprechenden „tatsächlichen Daten“ Mitgliedern zu ermöglichen.

+0

FYI, diese zusätzlichen Verfahren werden auch beim Verzehr von SOAP 1.2 WSDLs serviert von Spring-WS in .NET 3.5 beteiligt. –

1

Das .NET Compact Framework unterstützt eine Teilmenge von WCF. Sie können diesen Support unter MSDN überprüfen. Schauen Sie einmal, es unterstützt möglicherweise genug, damit Sie Ihre alte Web Services-Unterstützung entfernen können.

0

Dies geschieht bei den Typen mit einem Standardwert von nicht null. In diesen Fällen kann der Webdienst nicht feststellen, ob ein Parameter auf den Standardwert gesetzt wurde oder gar nicht.

Sie können die zusätzlichen Spezifikation Parameter loszuwerden, indem Ihren Betrieb mit dem [XmlSerializerFormat] Attribute schmückt wie:

[OperationContract] 
    [XmlSerializerFormat] 
    string GetEmpInfo(int? empNo); 

Dieses Attribut kann auch auf der Klassenstufe hinzugefügt werden, und dies würde Sinn in den meisten Fällen machen.

Ich verstehe Sie diese Situation Nullable Types mit umgehen kann (int?), aber ich war nicht in der Lage, es zu beheben dieses verwenden.

Verwandte Themen