Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En el ejemplo JSONP se muestra cómo admitir JSON con relleno (JSONP) en los servicios REST de WCF. JSONP es una convención que se usa para invocar scripts entre dominios mediante la generación de etiquetas de script en el documento actual. El resultado se devuelve en una función de retorno establecida. JSONP se basa en la idea de que las etiquetas como <script src="http://..." >
pueden evaluar scripts de cualquier dominio y el script recuperado por esas etiquetas se evalúa dentro de un ámbito en el que ya se pueden definir otras funciones.
Demostraciones
Scripting a través de dominios con JSONP.
Discusión
El ejemplo incluye una página web que agrega dinámicamente un bloque de script después de que la página se haya representado en el explorador. Este bloque de script llama a un servicio REST de WCF que tiene una sola operación, GetCustomer
. El servicio REST de WCF devuelve el nombre y la dirección de un cliente encapsulados en un nombre de función de devolución de llamada. Cuando responde el servicio REST de WCF, la función de devolución de llamada de la página web se invoca con los datos del cliente y la función de devolución de llamada muestra los datos en la página web. El control ASP.NET AJAX ScriptManager gestiona automáticamente la inyección de la etiqueta de script y la ejecución de la función de devolución de llamada. El patrón de uso es el mismo que con todos los servidores proxy de AJAX de ASP.NET, con la adición de una línea para habilitar JSONP, como se muestra en el código siguiente:
var proxy = new JsonpAjaxService.CustomerService();
proxy.set_enableJsonp(true);
proxy.GetCustomer(onSuccess, onFail, null);
La página web puede llamar al servicio REST de WCF porque el servicio usa el WebScriptEndpoint con crossDomainScriptAccessEnabled
establecido en true
. Ambas configuraciones se realizan en el archivo Web.config dentro del <elemento system.serviceModel>.
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webScriptEndpoint>
<standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
</webScriptEndpoint>
</standardEndpoints>
</system.serviceModel>
ScriptManager administra la interacción con el servicio y oculta la complejidad de implementar manualmente el acceso JSONP. Cuando crossDomainScriptAccessEnabled
se establece en true
y el formato de respuesta de una operación es JSON, la infraestructura de WCF inspecciona el URI de la solicitud para buscar un parámetro de cadena de una consulta de devolución de llamada y encapsula la respuesta JSON con el valor de dicho parámetro. En el ejemplo, la página web llama al servicio REST wcF con el siguiente URI.
http://localhost:33695/CustomerService/GetCustomer?callback=Sys._json0
Dado que el parámetro de cadena de consulta de callback tiene un valor de JsonPCallback
, el servicio WCF devuelve una respuesta JSONP que se muestra en el ejemplo siguiente.
Sys._json0({"__type":"Customer:#Microsoft.Samples.Jsonp","Address":"1 Example Way","Name":"Bob"});
Esta respuesta JSONP incluye los datos del cliente con formato JSON, ajustados con el nombre de la función de devolución de llamada que la página web solicitó. El ScriptManager ejecutará esta devolución de llamada utilizando una etiqueta de script para lograr la solicitud a través de los dominios y, a continuación, pasará el resultado al controlador onSuccess que se pasó a la operación GetCustomer del proxy AJAX de ASP.NET.
El ejemplo consta de dos aplicaciones web ASP.NET: una contiene solo un servicio WCF y otra contiene la página web .aspx, que llama al servicio. Al ejecutar la solución, Visual Studio hospedará los dos sitios web en puertos diferentes, lo que crea un entorno en el que el servicio y el cliente residen en dominios diferentes.
Para ejecutar el ejemplo
Abra la solución para el ejemplo de JSONP.
Presione F5 para iniciarse
http://localhost:26648/JSONPClientPage.aspx
en el explorador.Observe que después de que se cargue la página, las entradas de texto de "Name" y "Address" se rellenan por valores. Estos valores se proporcionaron desde una llamada al servicio WCF después de que el explorador haya terminado de representar la página.