Das aktuelle Projekt, an dem ich gerade arbeite, nutzt Webservices ausgiebig und wird in .net 3.5 erstellt. Jetzt, wo wir die Implementierung der zweiten Phase durchführen, sind wir verwirrt, ob wir WCF oder den Web-Service wie zuvor verwenden sollten. Außerdem gibt es etwas Neues, das nützlich sein kann und mit .net 4.0 in Bezug auf Webservices oder WCF kommt.Was wählen? ASMX-Webdienst oder WCF in .net 3.5?
Antwort
Wir haben zum ersten Mal ein brandneues Projekt mit WCF anstelle von ASMX Web Services abgeschlossen. Wir sind sehr glücklich mit den Ergebnissen, wissen aber, dass es eine steile Lernkurve gab. Trotzdem sind wir sehr zufrieden mit den Gesamtergebnissen und wissen, dass dies die Grundlage für alles ist, was Microsoft tut, und es hat sich absolut gelohnt.
Quick Nutzen wir gewonnen OVER ASMX:
1) für den internen (hinter einer Firewall) Service-to-Service-Anrufe, die wir nutzen das Netz: TCP-Bindung, die als SOAP viel schneller ist
2) Wir haben sowohl einen net: tcp-Endpunkt als auch einen "web" -Endpunkt für denselben Dienst mit nur einer Konfigurationsdatei-Aktualisierung aktiviert (keine Code-Änderungen)
3) Wir konnten AJAX-unterstützende RESTful-Web-Services mit nur Konfiguration erstellen ändert und verwendet den DataContractJsonSerializer, der bereits eingebaut ist. T Sonst hätten wir einen HTTP-Handler (ashx) schreiben und den Großteil der JSN-Serialisierung und URL-Parsing von Hand handhaben müssen.
4) Da unsere Website für Leistungsoptimierung und Stabilität skalieren muss, versuchen wir, eine MSMQ-basierte Nachrichtenstruktur zu verwenden, die asynchron UND garantiert ist und an Transaktionen beteiligt ist. WCF stellt eine MSMQ-Bindung bereit, die in unseren Services nur wenig bis keine Codeänderungen erfordert. Sie müssen nur auf Updates verweisen und MSMQ ordnungsgemäß mit den vorhandenen Services einrichten (und Attribute für Transaktionsgrenzen hinzufügen).
ABER WARNING: Wirklich investieren in das Lernen dieses (kaufen Sie das blaue O-Reily Buch und durchlaufen Sie es). Es gibt Dinge wie argument-name-changes während der Entwicklung, die die Service-Referenzen nicht unterbrechen, aber dazu führen, dass Null-Argumente übergeben werden (integrierte Versions-Skew-Behandlung), zu berücksichtigende Hosting-Modelle (Windows Service vs. IIS) und Instanziierung Modelle und FaultExceptions für alle WIRKLICH verstehen. Wir gingen nicht rein und wir hatten einige Schmerzen. Aber wir haben weitergemacht und sind sehr glücklich mit unseren Lernerfolgen und der Flexibilität und den Wachstumsmöglichkeiten, die wir nicht mehr an ASMX gebunden haben!
Es gibt verschiedene Punkte, bevor Sie zu WCF Springen auf zu berücksichtigen:
- WCF architektonisch robusten und fördert Best Practices.
- Wenn Sie wissen, was Sie tun, ist es "seidig glatt", wenn Sie nicht in einer Fahrt sind.
- Haben Sie genug Zeit, um die Konvertierung Ihrer Dienste abzuschließen?
Abschließend möchte ich sagen, dass, wenn Sie die Zeit haben, der bling und der Muskel das Upgrade zu tun. Das ist es wert. Wenn asmx alle Anforderungen erfüllt, können Sie mit Webdiensten fortfahren.
Zwei weitere Aspekte:
Egal, wie Sie diese entscheiden, für die serverseitige, können Sie einfach konsumieren Webservices und WCF-Dienste unter Verwendung von nur WCF auf der Client-Seite. Dies ist von Wert, wenn Sie mehrere Dienste mit einem einzigen Client verwenden.
Sie haben nach kommenden Themen gefragt. Wenn Sie Cloud Computing in Betracht ziehen: Es ist möglich, WCF-Dienste auf Windows Azure zu hosten.
ASMX ist groß und einfach - aber es ist sehr begrenzt in vielerlei Hinsicht:
- Sie Ihre Web-Dienste in IIS hosten kann
- Sie können Web-Services nur über HTTP Ihre erreichen
- Sicherheit ist sehr begrenzt
WCF behebt dies - und bietet darüber hinaus viel mehr. Sie können Ihre WCF-Dienste in IIS hosten oder bei Bedarf selbst in einer Konsolenanwendung oder einem Windows NT-Dienst hosten. Sie können Ihre WCF-Dienste über HTTP, TCP/IP, MSMQ, Peer-to-Peer-Protokolle, Named Pipes für die Kommunikation zwischen Computern und vieles mehr verbinden.
Ich würde auf jeden Fall empfehlen Sie gehen mit WCF. Es ist ein bisschen komplexer als ASMX, aber es bietet auch einfach so viel mehr Möglichkeiten und Möglichkeiten!
Resores: Es gibt die MSDN WCF Developer Center, die alles von Anfängern Tutorien zu Artikeln und Beispielcode hat.
Auch würde ich empfehlen Ihnen einen Blick auf die Pluralsight screen casts on WCF haben - es ist eine ausgezeichnete Reihe von „Creating your first WCF service“ gehen und „Creating your first WCF client“ den ganzen Weg zu eher fortgeschrittenen Themen. Aaron Skonnard erklärt alles sehr schön in 10-15 Minuten Screencasts - sehr empfehlenswert!
Stellen Sie bei WCF oder ASMX sicher, dass Sie Ihre Dienste Ihren Seiten hinzufügen, indem Sie das asp: ScriptManager-Tag verwenden. Es wird JavaScript-Proxies für Sie erstellen, und der Vorteil ist, dass Sie überhaupt kein Parsing erstellen müssen, unabhängig vom zugrunde liegenden Protokoll. Es ist sehr, sehr nett. Dieses Beispiel ist ASMX, aber es ist genauso sauber wie WCF.
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/WebServices/Admin/HospitalLocationService.asmx" InlineScript="true" />
</Services>
</asp:ScriptManager>
Auch können Sie ASMX JSON machen senden, indem Sie das Script Hinzufügen und Script Attribute:
<System.Web.Services.WebService(Namespace:="http://www.fujimed.com/")> _
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
<ScriptService()> _
Public Class HospitalLocationService
Inherits System.Web.Services.WebService
<WebMethod()> _
<ScriptMethod()> _
Public Function GetAll() As List(Of HospitalLocationEntity)
Return (New HospitalLocation()).GetAll().Data
End Function
<WebMethod()> _
<ScriptMethod()> _
Public Function GetByID(ByVal ID As Integer) As HospitalLocationEntity
Return (New HospitalLocation()).GetHospitalLocation(ID).Data
End Function
End Class
den Dienst Konsumieren, ohne Analyse (das ist, was das Script für Sie tut):
function editLocation(id) {
vRIS.HospitalLocationService.GetByID(id, getComplete, getError);
}
function getComplete(results, context, methodName) {
document.all['txtLocation'].value = results.Location;
document.all['txtInterfaceID'].value = results.InterfaceID;
document.all['selActive'].value = results.Active ? "true" : "false";
document.all['hdnLocationID'].value = results.ID.toString();
}
function getError(errorInfo, context, methodName) {
Alert(methodName + " : " + errorInfo);
document.all['txtLocation'].value = "";
document.all['txtInterfaceID'].value = "";
document.all['selActive'].value = "false";
document.all['hdnLocationID'].value = "";
}
Bearbeitet hinzuzufügen: Mit all den oben genannten basierend auf ASMX, würde ich immer noch WCF gehen, für die Vielseitigkeit und für die Möglichkeit, Datenverträge zu definieren. Untersuchen Sie auch WCF RIA Services. Sie zielen auf die Unterstützung von AJAX und Silverlight ab und automatisieren einen Großteil der WCF-Konfiguration.
Das WCF-Modell ist wesentlich flexibler, im Wesentlichen - wenn Sie nur verwenden Sie es ein grundlegendes http-Modell mit Basic-Profil und XML, mit Proxy-Objekten zu präsentieren - es wird sehr ähnlich aussehen.obwohl
Eine kurze Liste der Unterschiede:
- viel bessere Unterstützung für Standards Schwellen (obwohl WSe2 und WSE3 für asmx verfügbar sind, es ist alles viel einfacher in WCF)
- MTOM eingebauten (und behebt ein bekannter Fehler, den ich erinnere, in WSE3 mit MTOM zu finden)
- viel breiterer Bereich der unterstützten Transporte/Protokolle usw., und die Verhaltensweisen sind vollständig konfigurierbar/erweiterbar; zum Beispiel in dem Sie eine benutzerdefinierte Serializer/Protokoll/Transport/etc seemlessly, nur verwenden, indem Sie die config
- viel reicher Konfiguration, sowohl bei config und Laufzeit
- volle Unterstützung für die Inspektoren und benutzerdefinierte Prinzipien
- Fähigkeit Wechsel zu teilen Objekt-Modelle, wenn Sie wollen
- können Sie es außerhalb eines Web-Servers hosten; B.
Tony ist die Aktualisierung wert die Bemühungen ... ich meine, sehen Sie eine erhebliche Leistung, Funktionalität und Flexibilität Verbesserung beim Wechsel von asmx zu WCF? – HotTester
+1 gute Punkte Tony – Perpetualcoder
Einige weitere Informationen zur Leistung hier: http://msdn.microsoft.com/en-us/library/bb310550.aspx – magnus