Puede exponer el servicio en dos puntos finales diferentes. el SOAP puede usar el enlace que admite SOAP, por ejemplo, basicHttpBinding, el RESTful puede usar el webHttpBinding. Supongo que su servicio REST estará en JSON, en ese caso, debe configurar los dos puntos finales con la siguiente configuración de comportamiento
Otra forma de hacerlo es exponer dos contratos de servicio diferentes y cada uno con una configuración específica. Esto puede generar algunos duplicados a nivel de código, sin embargo, al final del día, desea que funcione.
Dice que mi contrato IEvents no es válido cuando intento hacer referencia a mi interfaz de servicio: <service name = "Events"> <endpoint address = "json" binding = "webHttpBinding" behaviourConfiguration = "jsonBehavior" contract = "IEvents" />. My IEvents tiene un atributo [ServiceContract] en la interfaz, así que no estoy seguro de por qué. </service>
PositiveGuy
Puedo hacer que localhost: 44652 / MyResource / json funcione, pero no puedo obtener una identificación para que funcione localhost: 44652 / MyResource / 98 / json . Intenté agregar un UriTemplate de "/ {id}", también probé "events / {id} pero no lo encuentro cuando intento acceder al servicio. Solo el primero funciona, no estoy seguro de cómo obtener el último para trabajar.
PositiveGuy
2
¿Cómo puede funcionar sin archivo físico allí? Parece que recibo errores 404, me falta algo
RoboJ1M
39
Esta publicación ya tiene una muy buena respuesta de "Wiki de la comunidad" y también recomiendo mirar el blog web de Rick Strahl, hay muchas publicaciones buenas sobre WCF Rest como esta .
Usé ambos para obtener este tipo de servicio MyService ... Entonces puedo usar la interfaz REST de jQuery o SOAP de Java.
En realidad, solo uso Json o Xml, pero esos dos están aquí con fines de demostración. Esas son solicitudes GET para obtener datos. Para insertar datos, usaría el método con atributos:
Esto es para fines de prueba. Solo para ver si sus puntos finales funcionan. ¿Has mirado en SoapUI? soapui.org
Darrel Miller
@TuomasHietanen: no obtengo respuesta de tipo JSON mediante el uso del comportamiento webHttp; sin embargo, usando enableWebScript sí obtengo respuesta de tipo JSON. Puse ResponseFormat como WebMessageFormat.Json. Por otro lado, no puedo usar URItemplate si uso el comportamiento enableWebScript. ¿Algunas ideas?
smile.al.d.way
1
@CoffeeAddict - ¿Por qué deberías usar la interfaz? ¿Solo para tener interfaz? No volverás a usar esta interfaz nunca. Esto es mas simple.
Tuomas Hietanen
25
Si solo desea desarrollar un único servicio web y alojarlo en muchos puntos finales diferentes (es decir, SOAP + REST, con salidas XML, JSON, CSV, HTML). También debe considerar usar ServiceStack, que he creado exactamente para este propósito, donde cada servicio que desarrolla está disponible automáticamente en los puntos finales SOAP y REST de forma inmediata sin ninguna configuración requerida.
El ejemplo de Hello World muestra cómo crear un servicio simple con solo (no se requiere configuración):
También viene incorporado con una salida HTML amigable (cuando se llama con un cliente HTTP que tiene Aceptar: texto / html, por ejemplo, un navegador) para que pueda visualizar mejor la salida de sus servicios.
El manejo de diferentes verbos REST también es trivial, aquí hay una aplicación CRUD de servicio REST completa en 1 página de C # (menos de lo que se necesitaría para configurar WCF;):
De manera predeterminada, Windows Communication Foundation (WCF) hace que los puntos finales estén disponibles solo para clientes SOAP. En Cómo: Crear un servicio HTTP web básico de WCF, un punto final está disponible para clientes que no son SOAP. Puede haber ocasiones en que desee que el mismo contrato esté disponible en ambos sentidos, como punto final web y como punto final SOAP. Este tema muestra un ejemplo de cómo hacer esto.
Finalmente, debemos definir el punto final 2 en la definición del servicio. Atención a la dirección = "" del punto final, donde REST servicio no es necesario nada.
Esto es lo que hice para que funcione. Asegúrese de poner webHttp automaticFormatSelectionEnabled = "true" dentro del comportamiento del punto final.
[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>
Respuestas:
Puede exponer el servicio en dos puntos finales diferentes. el SOAP puede usar el enlace que admite SOAP, por ejemplo, basicHttpBinding, el RESTful puede usar el webHttpBinding. Supongo que su servicio REST estará en JSON, en ese caso, debe configurar los dos puntos finales con la siguiente configuración de comportamiento
Un ejemplo de configuración de punto final en su escenario es
entonces, el servicio estará disponible en
Aplique [WebGet] al contrato de operación para que sea RESTful. p.ej
Tenga en cuenta que si el servicio REST no está en JSON, los parámetros de las operaciones no pueden contener tipos complejos.
Responder a la publicación de SOAP y RESTful POX (XML)
Para XML antiguo simple como formato de retorno, este es un ejemplo que funcionaría tanto para SOAP como para XML.
Comportamiento de POX para REST Plain Old XML
Puntos finales
El servicio estará disponible en
Solicitud REST pruébalo en el navegador,
Configuración del punto final del cliente de solicitud SOAP para el servicio SOAP después de agregar la referencia del servicio,
C ª#
Otra forma de hacerlo es exponer dos contratos de servicio diferentes y cada uno con una configuración específica. Esto puede generar algunos duplicados a nivel de código, sin embargo, al final del día, desea que funcione.
fuente
Esta publicación ya tiene una muy buena respuesta de "Wiki de la comunidad" y también recomiendo mirar el blog web de Rick Strahl, hay muchas publicaciones buenas sobre WCF Rest como esta .
Usé ambos para obtener este tipo de servicio MyService ... Entonces puedo usar la interfaz REST de jQuery o SOAP de Java.
Esto es de mi web.
Y esta es mi clase de servicio (.svc-codebehind, no se requieren interfaces):
En realidad, solo uso Json o Xml, pero esos dos están aquí con fines de demostración. Esas son solicitudes GET para obtener datos. Para insertar datos, usaría el método con atributos:
fuente
Si solo desea desarrollar un único servicio web y alojarlo en muchos puntos finales diferentes (es decir, SOAP + REST, con salidas XML, JSON, CSV, HTML). También debe considerar usar ServiceStack, que he creado exactamente para este propósito, donde cada servicio que desarrolla está disponible automáticamente en los puntos finales SOAP y REST de forma inmediata sin ninguna configuración requerida.
El ejemplo de Hello World muestra cómo crear un servicio simple con solo (no se requiere configuración):
No se requiere ninguna otra configuración, y este servicio está disponible de inmediato con REST en:
También viene incorporado con una salida HTML amigable (cuando se llama con un cliente HTTP que tiene Aceptar: texto / html, por ejemplo, un navegador) para que pueda visualizar mejor la salida de sus servicios.
El manejo de diferentes verbos REST también es trivial, aquí hay una aplicación CRUD de servicio REST completa en 1 página de C # (menos de lo que se necesitaría para configurar WCF;):
fuente
MSDN parece tener un artículo para esto ahora:
https://msdn.microsoft.com/en-us/library/bb412196(v=vs.110).aspx
Introducción:
fuente
Debemos definir la configuración del comportamiento para el punto final REST
y también a un servicio
Después de los comportamientos, el siguiente paso son los enlaces. Por ejemplo, basicHttpBinding to SOAP endpoint y webHttpBinding to REST .
Finalmente, debemos definir el punto final 2 en la definición del servicio. Atención a la dirección = "" del punto final, donde REST servicio no es necesario nada.
En la interfaz del servicio definimos la operación con sus atributos.
Uniéndose a todas las partes, esta será nuestra definición de WCF system.serviceModel.
Para probar ambos puntos finales, podemos usar WCFClient para SOAP y PostMan para REST .
fuente
Esto es lo que hice para que funcione. Asegúrese de poner
webHttp automaticFormatSelectionEnabled = "true" dentro del comportamiento del punto final.
Modelo de servicio interno
Comportamiento de EndPoint
fuente