Sie können den Dienst an zwei verschiedenen Endpunkten verfügbar machen. Der SOAP kann die Bindung verwenden, die SOAP unterstützt, z. B. basicHttpBinding, der RESTful kann die webHttpBinding verwenden. Ich gehe davon aus, dass sich Ihr REST-Service in JSON befindet. In diesem Fall müssen Sie die beiden Endpunkte mit der folgenden Verhaltenskonfiguration konfigurieren
Eine andere Möglichkeit besteht darin, zwei verschiedene Serviceverträge mit jeweils einer bestimmten Konfiguration verfügbar zu machen. Dies kann einige Duplikate auf Codeebene erzeugen, aber am Ende des Tages möchten Sie, dass es funktioniert.
Ich möchte noch einen Schritt weiter gehen und eine Bindung an HTTPS für die JSON-Adresse hinzufügen. Wie mache ich das? stackoverflow.com/questions/18213472/…
Steve
Es heißt, dass mein Vertrag IEvents ungültig ist, wenn ich versuche, auf meine Service-Schnittstelle zu verweisen: <service name = "Events"> <endpoint address = "json" binding = "webHttpBinding" behaviourConfiguration = "jsonBehavior" contract = "IEvents" />. Mein IEvents hat ein [ServiceContract] -Attribut auf der Schnittstelle, daher weiß ich nicht warum. </ service>
PositiveGuy
Ich kann localhost: 44652 / MyResource / json zum Laufen bringen , aber ich kann keine ID zum Arbeiten bekommen localhost: 44652 / MyResource / 98 / json . Ich habe versucht, ein UriTemplate von "/ {id}" hinzuzufügen, habe aber auch "events / {id}" versucht, aber es wird nicht gefunden, wenn ich versuche, den Dienst zu starten. Nur das erste funktioniert, nicht sicher, wie ich das letztere bekomme zu arbeiten.
PositiveGuy
2
Wie kann es dort ohne physische Datei funktionieren? Ich scheine nur 404 Fehler zu bekommen, muss etwas fehlen
RoboJ1M
39
Dieser Beitrag hat bereits eine sehr gute Antwort von "Community Wiki" und ich empfehle auch, sich Rick Strahls Web Blog anzusehen, es gibt viele gute Beiträge über WCF Rest wie diesen .
Ich habe beide verwendet, um diese Art von MyService-Service zu erhalten ... Dann kann ich die REST-Schnittstelle von jQuery oder SOAP von Java verwenden.
Eigentlich benutze ich nur Json oder Xml, aber beide sind hier für einen Demo-Zweck. Das sind GET-Anfragen zum Abrufen von Daten. Zum Einfügen von Daten würde ich eine Methode mit Attributen verwenden:
Dies dient zu Testzwecken. Nur um zu sehen, ob Ihre Endpunkte funktionieren. Haben Sie sich SoapUI angesehen? soapui.org
Darrel Miller
@TuomasHietanen - Ich erhalte keine Antwort vom Typ JSON, wenn ich das Verhalten von webHttp verwende. Bei Verwendung von enableWebScript erhalte ich jedoch eine Antwort vom Typ JSON. Ich habe ResponseFormat als WebMessageFormat.Json eingefügt. Andererseits kann ich URItemplate nicht verwenden, wenn ich das Verhalten von enableWebScript verwende. Irgendwelche Ideen?
smile.al.d.way
1
@CoffeeAddict - Warum sollten Sie inteface verwenden? Nur um eine Schnittstelle zu haben? Sie werden diese Schnittstelle niemals wiederverwenden. Das ist einfacher.
Tuomas Hietanen
25
Wenn Sie nur einen einzigen Webdienst entwickeln und auf vielen verschiedenen Endpunkten hosten lassen möchten (z. B. SOAP + REST mit XML-, JSON-, CSV- und HTML-Ausgaben). Sie sollten auch die Verwendung von ServiceStack in Betracht ziehen, den ich genau für diesen Zweck erstellt habe, bei dem jeder von Ihnen entwickelte Service automatisch auf SOAP- und REST-Endpunkten verfügbar ist, ohne dass eine Konfiguration erforderlich ist.
Das Hello World- Beispiel zeigt, wie Sie einen einfachen Dienst mit nur (keine Konfiguration erforderlich) erstellen:
Es ist außerdem mit einer benutzerfreundlichen HTML-Ausgabe ausgestattet (wenn es mit einem HTTP-Client mit Accept: text / html, z. B. einem Browser, aufgerufen wird ), damit Sie die Ausgabe Ihrer Dienste besser visualisieren können.
Der Umgang mit verschiedenen REST-Verben ist ebenfalls trivial. Hier ist eine vollständige REST-Service-CRUD-App auf einer Seite von C # (weniger als für die Konfiguration von WCF erforderlich;):
Standardmäßig stellt Windows Communication Foundation (WCF) Endpunkte nur SOAP-Clients zur Verfügung. Unter Gewusst wie: Erstellen eines einfachen WCF-Web-HTTP-Dienstes wird ein Endpunkt Nicht-SOAP-Clients zur Verfügung gestellt. Es kann vorkommen, dass Sie denselben Vertrag in beide Richtungen als Webendpunkt und als SOAP-Endpunkt verfügbar machen möchten. Dieses Thema zeigt ein Beispiel dafür.
Schließlich müssen wir den 2-Endpunkt in der Service-Definition definieren. Achtung für die Adresse = "" des Endpunktes, wo REST-Service nicht notwendig ist, nichts.
Das habe ich getan, damit es funktioniert. Stellen Sie sicher, dass Sie webHttpomaticFormatSelectionEnabled = "true" in das Endpunktverhalten einfügen .
[ServiceContract]publicinterfaceITestService{[WebGet(BodyStyle=WebMessageBodyStyle.Bare,UriTemplate="/product",ResponseFormat=WebMessageFormat.Json)]stringGetData();}publicclassTestService:ITestService{publicstringGetJsonData(){return"I am good...";}}
<endpointBehaviors><behaviorname="jsonBehavior"><webHttpautomaticFormatSelectionEnabled="true"/><!-- use JSON serialization --></behavior></endpointBehaviors>
Antworten:
Sie können den Dienst an zwei verschiedenen Endpunkten verfügbar machen. Der SOAP kann die Bindung verwenden, die SOAP unterstützt, z. B. basicHttpBinding, der RESTful kann die webHttpBinding verwenden. Ich gehe davon aus, dass sich Ihr REST-Service in JSON befindet. In diesem Fall müssen Sie die beiden Endpunkte mit der folgenden Verhaltenskonfiguration konfigurieren
Ein Beispiel für die Endpunktkonfiguration in Ihrem Szenario ist
Der Service wird also unter verfügbar sein
Wenden Sie [WebGet] auf den Betriebsvertrag an, um ihn RESTful zu machen. z.B
Wenn sich der REST-Service nicht in JSON befindet, dürfen die Parameter der Operationen keinen komplexen Typ enthalten.
Antwort auf den Beitrag für SOAP und RESTful POX (XML)
Für einfaches altes XML als Rückgabeformat ist dies ein Beispiel, das sowohl für SOAP als auch für XML funktionieren würde.
POX-Verhalten für REST Plain Old XML
Endpunkte
Der Service wird unter verfügbar sein
REST-Anfrage versuchen Sie es im Browser,
Konfiguration des SOAP-Anforderungsclientendpunkts für den SOAP-Dienst nach Hinzufügen der Dienstreferenz
in C #
Eine andere Möglichkeit besteht darin, zwei verschiedene Serviceverträge mit jeweils einer bestimmten Konfiguration verfügbar zu machen. Dies kann einige Duplikate auf Codeebene erzeugen, aber am Ende des Tages möchten Sie, dass es funktioniert.
quelle
Dieser Beitrag hat bereits eine sehr gute Antwort von "Community Wiki" und ich empfehle auch, sich Rick Strahls Web Blog anzusehen, es gibt viele gute Beiträge über WCF Rest wie diesen .
Ich habe beide verwendet, um diese Art von MyService-Service zu erhalten ... Dann kann ich die REST-Schnittstelle von jQuery oder SOAP von Java verwenden.
Dies ist aus meiner Web.Config:
Und das ist meine Service-Klasse (.svc-Codebehind, keine Schnittstellen erforderlich):
Eigentlich benutze ich nur Json oder Xml, aber beide sind hier für einen Demo-Zweck. Das sind GET-Anfragen zum Abrufen von Daten. Zum Einfügen von Daten würde ich eine Methode mit Attributen verwenden:
quelle
Wenn Sie nur einen einzigen Webdienst entwickeln und auf vielen verschiedenen Endpunkten hosten lassen möchten (z. B. SOAP + REST mit XML-, JSON-, CSV- und HTML-Ausgaben). Sie sollten auch die Verwendung von ServiceStack in Betracht ziehen, den ich genau für diesen Zweck erstellt habe, bei dem jeder von Ihnen entwickelte Service automatisch auf SOAP- und REST-Endpunkten verfügbar ist, ohne dass eine Konfiguration erforderlich ist.
Das Hello World- Beispiel zeigt, wie Sie einen einfachen Dienst mit nur (keine Konfiguration erforderlich) erstellen:
Es ist keine andere Konfiguration erforderlich, und dieser Service ist mit REST sofort verfügbar in:
Es ist außerdem mit einer benutzerfreundlichen HTML-Ausgabe ausgestattet (wenn es mit einem HTTP-Client mit Accept: text / html, z. B. einem Browser, aufgerufen wird ), damit Sie die Ausgabe Ihrer Dienste besser visualisieren können.
Der Umgang mit verschiedenen REST-Verben ist ebenfalls trivial. Hier ist eine vollständige REST-Service-CRUD-App auf einer Seite von C # (weniger als für die Konfiguration von WCF erforderlich;):
quelle
MSDN scheint jetzt einen Artikel dafür zu haben:
https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx
Intro:
quelle
Wir müssen die Verhaltenskonfiguration für den REST- Endpunkt definieren
und auch zu einem Service
Nach dem Verhalten sind die Bindungen der nächste Schritt. Zum Beispiel basicHttpBinding an SOAP- Endpunkt und webHttpBinding an REST .
Schließlich müssen wir den 2-Endpunkt in der Service-Definition definieren. Achtung für die Adresse = "" des Endpunktes, wo REST-Service nicht notwendig ist, nichts.
In der Schnittstelle des Dienstes definieren wir die Operation mit ihren Attributen.
Dies ist unsere WCF system.serviceModel-Definition.
Um beide Endpunkte zu testen, können wir WCFClient für SOAP und PostMan für REST verwenden .
quelle
Das habe ich getan, damit es funktioniert.
Stellen Sie sicher, dass Sie webHttpomaticFormatSelectionEnabled = "true" in das Endpunktverhalten einfügen .
Inside Service-Modell
EndPoint-Verhalten
quelle