asp.net - entre - wcf vs rest
Hacer que un servicio web de WCF funcione con solicitudes GET (3)
Fondo
Creé servicios web ASMX en el pasado y pude acceder al servicio desde el navegador web y las solicitudes Ajax GET utilizando la convención de direcciones:
MyService.asmx/MyMethod?Param=xxx
Empecé a usar WCF y creé un nuevo servicio web en mi proyecto ASP.NET. Crea un archivo con la extensión .svc como MyService.svc.
Situación actual
Puedo consumir el servicio usando WcfTestClient
que viene con VS2008. También puedo crear mi propio WCF Client agregando una referencia de servicio en otro proyecto o usando la línea de comandos svcutil.exe
para generar el archivo proxy y config.
El problema
Cuando trato de utilizar el servicio desde un navegador usando MyService.svc/MyMethod?MyParam=xxx
, obtengo una página en blanco sin ningún error.
Lo que he intentado
Ya he agregado un basicHttpBinding al web.config y lo HttpGetEnabled hecho HttpGetEnabled en la configuración de comportamiento. También agregué el [WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")]
a mi contrato de operación.
Ya he seguido la información en esta otra pregunta de desbordamiento de pila:
REST / SOAP EndPoints para un servicio WCF
Sin embargo, o bien obtengo una página en blanco o un error HTTP 404 después de seguir esos pasos. No hay nada especial sobre el código. Solo tomo una cadena como parámetro y devuelvo "Hola xxx". Esta es una cosa básica del tipo de prueba de concepto "Hello WCF World".
ACTUALIZACIÓN - Aquí está el código relevante[ServiceContract]
public interface IMyService
{
[WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")]
[OperationContract]
string MyMethod(string MyParam);
}
Web.Config - system.serviceModel Section
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyService">
<endpoint address=""
binding="wsHttpBinding" contract="IMyService" />
<endpoint address="MyService.svc"
binding="basicHttpBinding" contract="IMyService" />
<endpoint address="mex"
binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
Al mirar su sección web.config
serviceModel, veo que necesita agregar un webHttpBinding y asociar un endPointBehavior que incluye webHttpGet .
Su contrato de operación es correcto. Así es como debe verse la sección de configuración de system.serviceModel para que pueda consumir el servicio desde una solicitud GET HTTP.
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="WebBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="MyServiceBehavior" name="MyService">
<endpoint address="ws" binding="wsHttpBinding" contract="IMyService"/>
<endpoint address="" behaviorConfiguration="WebBehavior"
binding="webHttpBinding"
contract="IMyService">
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
</system.serviceModel>
Asegúrese de asignar una dirección diferente a su punto final wsHttpBinding; de lo contrario, recibirá un error que indica que tiene dos puntos finales que escuchan en el mismo URI.
Otra opción es dejar la dirección en blanco en wsHttpBinding, pero asigne una dirección diferente al servicio webHttpBinding. Sin embargo, eso también cambiará su dirección GET.
Por ejemplo, si asigna la dirección como "asmx", debe llamar a su servicio con la dirección " MyService.svc/asmx/MyMethod?MyParam=xxxx
".
Como dice marc_s , REST Starter Kit puede ayudar, pero también debe tener en cuenta que .NET 3.5 tiene soporte para servicios REST directamente en él. No es tan completo como lo que puedes hacer con el kit de inicio, pero es útil.
La forma en que funciona es que pones un atributo [WebGet]
en tus operaciones para indicar de qué parte de la URL deben venir los diversos parámetros:
[WebGet(UriTemplate = "helloworld/{name}")]
string Helloworld(string name);
Vea este portal para toneladas de información.
Tenga en cuenta que puede exponer el mismo servicio como SOAP y REST si especifica múltiples puntos finales / enlaces en la configuración.
Las solicitudes normales de WCF siempre son solicitudes SOAP: no podrá hacer esto con su navegador, necesitará WCF Testclient para eso.
Hay un add-on para WCF llamado WCF REST Starter Kit (que también se incluirá en WCF 4.0 con .NET 4.0), que le permite usar los comandos GET / POST / PUT / DELETE HTTP para consultar los servicios de WCF y demás. Sin embargo, debe escribir sus servicios específicamente para REST; no puede tener SOAP y REST en la misma llamada de servicio.
Bagazo