[WCF] Metadatos en un WCF habilitado para AJAX

 

Si queremos añadir  un servicio WCF habilitado para AJAX, podemos hacerlo desde Añadir un nuevo item y seleccionar el elemento correspondiente:

image

Esto añade el servicio a nuestro proyecto. Sin embargo, cuando lo arrancamos podemos ver un mensaje que indica que la publicación de metadatos está desactivada para ese servicio. La página del servicio nos sugiere que añadamos lo siguiente a nuestro fichero de configuración, que en efecto sirve para habilitar los metadatos sin mayor problema:

<behaviors>
    <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
    </serviceBehaviors>
</behaviors>

Lo añadimos pero sigue sin habilitarse los metadatos Incluso muestra un mensaje de error indicando que el fichero de configuración es incorrecto. Si observamos el fichero de configuración (normalmente web/app.config) veremos que faltan algunos datos por configurar. Aquí voy a mostrar cómo debe quedar el .config para que la publicación de metadatos sea efectiva.

El error que nos muestra indica que la definición del servicio no incluye la dirección del endpoint. Por ello:

1 – Lo primero que hacemos es añadir el behaviour de nuestro servicio en la sección que indiqué anteriormente y añadirle la etiqueta para que reconozca los metadatos y habilitarla.

    <behaviors>
      <serviceBehaviors>
        <behavior name="TestWCFAjax.Service1AspNetAjaxBehavior">
          <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

2 – Fijémonos en la definición del servicio que ha creado por defecto:

<service name="TestWCFAjax.Service1">
        <endpoint address="" behaviorConfiguration="TestWCFAjax.Service1AspNetAjaxBehavior"
          binding="webHttpBinding" contract="TestWCFAjax.Service1" />
      </service>

Lógicamente no encuentra un endpoint similar y ahí se produce el error. Pero, ¿dónde está? Fijémonos que anteriormente teníamos definido un behaviour y dentro un endpoint que hacía referencia a nuestro servicio. Ahora al cambiar esto, es nuestro servicio como tal quien tiene un behavior asociado y no su endpoint:

 <service name="TestWCFAjax.Service1" behaviorConfiguration="TestWCFAjax.Service1AspNetAjaxBehavior">
        <endpoint address="" binding="webHttpBinding" contract="TestWCFAjax.Service1" />

Con esto nuestro servicio ya arrancará con los metadatos habilitados.