Exponer servicios de WCF a script de cliente

Actualización: noviembre 2007

Windows Communication Foundation (WCF) es el modelo de programación unificado de Microsoft para generar aplicaciones orientadas a servicios. Admite AJAX de ASP.NET y el formato de datos JavaScript Object Notation (JSON). El modelo permite a los servicios WCF exponer la funcionalidad a las páginas web que ejecutan código ECMAScript (JavaScript) y que, por tanto, pueden tener acceso a estos servicios mediante solicitudes HTTP. 

Si ya ha creado servicios WCF, puede agregar puntos finales para habilitar el script en páginas web habilitadas para AJAX y tener así acceso a esos servicios. En este tema se muestra cómo permitir que un servicio WCF esté disponible para el JavaScript que se ejecute en el explorador.

.NET Framework crea automáticamente las clases de proxy de JavaScript para los servicios WCF en el momento de cargar la página y descarga el script de la clase de proxy al explorador. Estas clases de proxy derivan de la clase Sys.Net.WebServiceProxy de Microsoft AJAX Library. 

Puede llamar a una operación de servicio WCF llamando al método correspondiente de la clase de proxy de JavaScript. Para obtener más información, vea Llamar a servicios web desde script de cliente.

Hacer que un servicio WCF sea accesible desde el script de cliente

Para que un servicio WCF esté disponible desde el script de cliente, debe cumplir los requisitos siguientes:

  • El servicio debe estar hospedado por una aplicación web que contiene un archivo con la extensión .svc. Este archivo contiene una directiva @ ServiceHost que señala al servicio WCF. En el ejemplo siguiente se muestra una directiva @ ServiceHost.

    <%@ ServiceHost Language=C# Service="Aspnet.Samples.SimpleService" CodeBehind="~/App_Code/SimpleService.cs"%> 
    
    <%@ ServiceHost Language=VB Service="Aspnet.Samples.SimpleService" CodeBehind="~/App_Code/SimpleService.vb"%> 
    
  • Debe configurar la aplicación web para que permita llamar a los servicios web desde el script. Para obtener más información, vea Cómo: Configurar servicios de WCF en ASP.NET AJAX.

  • El servicio debe ser una clase que implemente una interfaz marcada con ServiceContractAttribute. Las operaciones de servicio individuales (métodos) que se van a llamar desde el script se deben certificar con el atributo OperationContractAttribute.

En el ejemplo siguiente se muestra una clase que implementa una interfaz marcada con ServiceContractAttribute.

namespace Samples.Aspnet
{
    [ServiceContract(Namespace="MyServices.org")]
    public interface ISimpleService
    {
        [OperationContract]
        string HelloWorld1(string value1);
        [OperationContract]
        string HelloWorld2(DataContractType dataContractValue1);
    }

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class SimpleService : ISimpleService
    {
        public SimpleService()
        { }

        public string HelloWorld1(string value1)
        {
            return "Hello " + value1;
        }
        public string HelloWorld2(DataContractType dataContractValue1)
        {
            return "Hello " + dataContractValue1.FirstName +
                                " " + dataContractValue1.LastName;
        }
    }

    [DataContract]
    public class DataContractType
    {
        string firstName;
        string lastName;

        [DataMember]
        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }
        [DataMember]
        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }
    }
Namespace Aspnet.Samples.SimpleService

    <ServiceContract(NameSpace="MyServices.org")> _
    Public Interface ISimpleService
        <OperationContract()> _
        Function HelloWorld1(ByVal value1 As String) As String
        <OperationContract()> _
        Function HelloWorld2(ByVal dataContractValue1 _
        As DataContractType) As String
    End Interface 'ISimpleService

    <ServiceBehavior(IncludeExceptionDetailInFaults:=True), _
    AspNetCompatibilityRequirements(RequirementsMode:= _
    AspNetCompatibilityRequirementsMode.Allowed)> _
    Public Class SimpleService
        Implements ISimpleService

        Public Sub New()

        End Sub 'New

        Public Function HelloWorld1(ByVal value1 As String) As String _
        Implements ISimpleService.HelloWorld1
            Return "Hello " + value1
        End Function 'HelloWorld1

        Public Function HelloWorld2(ByVal dataContractValue1 _
        As DataContractType) As String _
        Implements ISimpleService.HelloWorld2
            Return "Hello " + dataContractValue1.FirstName + " " + _
            dataContractValue1.LastName
        End Function 'HelloWorld2
    End Class 'SimpleService

    <DataContract()> _
    Public Class DataContractType
        Private _firstName As String
        Private _lastName As String


        <DataMember()> _
        Public Property FirstName() As String
            Get
                Return _firstName
            End Get
            Set(ByVal value As String)
                _firstName = value
            End Set
        End Property

        <DataMember()> _
        Public Property LastName() As String
            Get
                Return _lastName
            End Get
            Set(ByVal value As String)
                _lastName = value
            End Set
        End Property
    End Class 'DataContractType 
End Namespace

Para obtener más información, vea Creating WCF Services for ASP.NET AJAX.

Utilizar un servicio WCF desde un script de cliente en una página web ASP.NET

Para llamar a un servicio WCF desde el script de cliente en una página web ASP.NET, primero se agrega un control ScriptManager a la página. A continuación, establezca mediante declaración el objeto ServiceReference agregando un elemento secundario asp:ServiceReference al control ScriptManager y estableciendo el atributo path para que señale al servicio WCF. En el ejemplo siguiente se muestra una referencia de servicio.

<asp:ScriptManager ID="ScriptManager1" >
  <Services>
    <asp:ServiceReference 
      Path="http://<serverhost>/SimpleService.svc"/>
  </Services>
</asp:ScriptManager>

El objeto ServiceReference sólo puede hacer referencia a un servicio web en el mismo dominio. La ruta de acceso del servicio web puede ser relativa, relativa a la aplicación, relativa al dominio o absoluta. En las rutas de acceso absolutas, debe asegurarse de que la ruta de acceso está en el mismo dominio.

Cuando se representa una página que contiene este control ScriptManager, crea una clase de proxy de JavaScript para el servicio WCF. La clase de proxy tiene funciones que corresponden a cada operación de servicio. La página también contiene clases de proxy de JavaScript que corresponden a los tipos de datos del servidor que se utilizan como parámetros de entrada o valores devueltos de los métodos de servicio web. Esto permite escribir scripts de cliente que inicializan estos parámetros y pasarlos a la llamada al método.

Vea también

Conceptos

Usar servicios web en ASP.NET para AJAX

Llamar a servicios web desde script de cliente

Otros recursos

Compatibilidad con JSON y otros formatos de transferencia de datos

Cómo usar la configuración para agregar un extremo AJAX de ASP.NET

Creación de servicios WCF para AJAX de ASP.NET

Cómo crear un servicio WFC con AJAX habilitado y un cliente ASP.NET que tenga acceso al servicio