28
Definición de un contrato de servicio de Windows Communication Foundation Es la primera de las seis tareas necesarias para crear una aplicación básica de Windows Communication Foundation (WCF). Para obtener información general de las seis tareas, vea el tema Tutorial de introducción. Al crear un servicio de WCF, la primera tarea es definir un contrato de servicio. El contrato de servicio especifica qué operaciones admite el servicio. Una operación se puede considerar un método de servicio Web. Los contratos se crean mediante la definición de una interfaz de C++, C# o Visual Basic (VB). Cada método de la interfaz se corresponde con una operación de servicio concreta. Cada interfaz debe tener ServiceContractAttribute aplicado y cada operación debe tener el atributo OperationContractAttribute aplicado. Si un método de una interfaz que tiene el atributo ServiceContractAttribute no tiene el atributo OperationContractAttribute, el servicio no expone ese método. El código usado para esta tarea se proporciona en el ejemplo que sigue al procedimiento. Para definir un contrato de servicio 1. Abra Visual Studio 2012 como administrador haciendo clic con el botón secundario en el programa en el menú Inicio y seleccionando Ejecutar como administrador. 2. Para crear un proyecto de biblioteca de servicio WCF, haga clic en el menú Archivo y seleccione Nuevo y Proyecto. En el lado izquierdo del cuadro de diálogo Nuevo proyecto, expanda Visual C# para un proyecto de C# u Otros lenguajes y después Visual Basicpara un proyecto de Visual Basic. Bajo el lenguaje seleccionado, seleccione WCF y aparecerá una lista de plantillas de proyecto en la sección central del cuadro de diálogo. Seleccione Biblioteca de servicios WCF y escriba GettingStartedLib en el cuadro de textoNombre y GettingStarted en el cuadro de texto Nombre de la solución en la parte inferior del cuadro de diálogo. 3. Visual Studio creará el proyecto que contiene 3 archivos: IService1.cs (o IService1.vb), Service1.cs (o Service1.vb) y App.config. El archivo IService1 contiene un contrato de servicio predeterminado. El archivo Service1 contiene una implementación predeterminada del contrato de servicio. El archivo App.config contiene la configuración necesaria para cargar el servicio predeterminado con el host de servicio WCF de Visual Studio. Para obtener más información acerca de la herramienta Host de servicio de WCF, vea Host de servicio WCF (WcfSvcHost.exe). 4. Abra el archivo IService1.cs o IService1.vb y elimine el código dentro de la declaración de espacio de nombres que sale de la declaración de espacio de nombres. Dentro de la declaración de espacio de nombres se define una nueva interfaz denominada ICalculatorcomo se muestra en el código siguiente. 5. // IService.cs 6. using System; 7. using System.Collections.Generic; 8. using System.Linq; 9. using System.Runtime.Serialization; 10. using System.ServiceModel; 11. using System.Text; 12.

Tutorial WCF

Embed Size (px)

DESCRIPTION

wcf msdn

Citation preview

  • Definicin de un contrato de servicio de Windows Communication Foundation Es la primera de las seis tareas necesarias para crear una aplicacin bsica de Windows Communication Foundation (WCF). Para obtener informacin general de las seis tareas, vea el tema Tutorial de introduccin. Al crear un servicio de WCF, la primera tarea es definir un contrato de servicio. El contrato de servicio especifica qu operaciones admite el servicio. Una operacin se puede considerar un mtodo de servicio Web. Los contratos se crean mediante la definicin de una interfaz de C++, C# o Visual Basic (VB). Cada mtodo de la interfaz se corresponde con una operacin de servicio concreta. Cada interfaz debe tener ServiceContractAttribute aplicado y cada operacin debe tener el atributo OperationContractAttribute aplicado. Si un mtodo de una interfaz que tiene el atributo ServiceContractAttribute no tiene el atributo OperationContractAttribute, el servicio no expone ese mtodo. El cdigo usado para esta tarea se proporciona en el ejemplo que sigue al procedimiento. Para definir un contrato de servicio

    1. Abra Visual Studio 2012 como administrador haciendo clic con el botn secundario en el programa en el men Inicio y seleccionando Ejecutar como administrador.

    2. Para crear un proyecto de biblioteca de servicio WCF, haga clic en el men Archivo y seleccione Nuevo y Proyecto. En el lado izquierdo del cuadro de dilogo Nuevo proyecto, expanda Visual C# para un proyecto de C# u Otros lenguajes y despus Visual Basicpara un proyecto de Visual Basic. Bajo el lenguaje seleccionado, seleccione WCF y aparecer una lista de plantillas de proyecto en la seccin central del cuadro de dilogo. Seleccione Biblioteca de servicios WCF y escriba GettingStartedLib en el cuadro de textoNombre y GettingStarted en el cuadro de texto Nombre de la solucin en la parte inferior del cuadro de dilogo.

    3. Visual Studio crear el proyecto que contiene 3 archivos: IService1.cs (o IService1.vb), Service1.cs (o Service1.vb) y App.config. El archivo IService1 contiene un contrato de servicio predeterminado. El archivo Service1 contiene una implementacin predeterminada del contrato de servicio. El archivo App.config contiene la configuracin necesaria para cargar el servicio predeterminado con el host de servicio WCF de Visual Studio. Para obtener ms informacin acerca de la herramienta Host de servicio de WCF, vea Host de servicio WCF (WcfSvcHost.exe).

    4. Abra el archivo IService1.cs o IService1.vb y elimine el cdigo dentro de la declaracin de espacio de nombres que sale de la declaracin de espacio de nombres. Dentro de la declaracin de espacio de nombres se define una nueva interfaz denominada ICalculatorcomo se muestra en el cdigo siguiente.

    5. // IService.cs 6. using System; 7. using System.Collections.Generic; 8. using System.Linq; 9. using System.Runtime.Serialization; 10. using System.ServiceModel; 11. using System.Text; 12.

  • 13. namespace GettingStartedLib 14. { 15. [ServiceContract(Namespace =

    "http://Microsoft.ServiceModel.Samples")] 16. public interface ICalculator 17. { 18. [OperationContract] 19. double Add(double n1, double n2); 20. [OperationContract] 21. double Subtract(double n1, double n2); 22. [OperationContract] 23. double Multiply(double n1, double n2); 24. [OperationContract] 25. double Divide(double n1, double n2); 26. } 27. } 28. 29.

    30. IService.vb 31. Imports System 32. Imports System.ServiceModel 33. 34. Namespace GettingStartedLib 35. 36. _ 37. Public Interface ICalculator 38. 39. _ 40. Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double 41. _ 42. Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double 43. _ 44. Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double 45. _ 46. Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double 47. End Interface 48. End Namespace 49. 50.

    Este contrato define una calculadora en lnea. Observe que la interfaz ICalculator se marca con el atributo ServiceContractAttribute.Este atributo define un espacio de nombres que se usa para eliminar la ambigedad del nombre del contrato.Cada operacin de calculadora se marca con el atributo OperationContractAttribute.

  • Cmo implementar un contrato de servicio de Windows Communication Foundation sta es la segunda de las seis tareas que son necesarias para crear un servicio Windows Communication Foundation (WCF) bsico y un cliente que llame al servicio. Para obtener una introduccin a las seis tareas, consulte el tema Tutorial de introduccin. El siguiente paso para crear una aplicacin de WCF es implementar la interfaz de servicio. Esto implica la creacin de una clase denominada CalculatorService que implemente la interfaz ICalculator definida por el usuario. Para implementar un contrato de servicio WCF

    Abra el archivo Service1.cs o Service1.vb y agregue el cdigo siguiente:

    C#

    //Service1.cs using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace GettingStartedLib { public class CalculatorService : ICalculator { public double Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("Received Add({0},{1})", n1, n2); // Code added to write output to the console window. Console.WriteLine("Return: {0}", result); return result; } public double Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("Received Subtract({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result;

  • } public double Multiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("Received Multiply({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Divide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("Received Divide({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } } } Service1.vb Imports System Imports System.ServiceModel Namespace GettingStartedLib Public Class CalculatorService Implements ICalculator Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add Dim result As Double = n1 + n2 ' Code added to write output to the console window. Console.WriteLine("Received Add({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract Dim result As Double = n1 - n2 Console.WriteLine("Received Subtract({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply

  • Dim result As Double = n1 * n2 Console.WriteLine("Received Multiply({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide Dim result As Double = n1 / n2 Console.WriteLine("Received Divide({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function End Class End Namespace Cada mtodo implementa la operacin de la calculadora y escribe texto en la consola para simplificar las pruebas.

    Ejemplo El siguiente cdigo muestra la interfaz que define el contrato y la implementacin de la interfaz. // IService1.cs using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace GettingStartedLib { [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); } } // Service1.cs using System; using System.Collections.Generic;

  • using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace GettingStartedLib { public class CalculatorService : ICalculator { public double Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("Received Add({0},{1})", n1, n2); // Code added to write output to the console window. Console.WriteLine("Return: {0}", result); return result; } public double Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("Received Subtract({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Multiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("Received Multiply({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Divide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("Received Divide({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } } } IService.vb Imports System Imports System.ServiceModel Namespace GettingStartedLib

  • _ Public Interface ICalculator _ Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double _ Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double _ Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double _ Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double End Interface End Namespace Imports System Imports System.ServiceModel Namespace GettingStartedLib Public Class CalculatorService Implements ICalculator Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add Dim result As Double = n1 + n2 ' Code added to write output to the console window. Console.WriteLine("Received Add({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract Dim result As Double = n1 - n2 Console.WriteLine("Received Subtract({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply Dim result As Double = n1 * n2 Console.WriteLine("Received Multiply({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function

  • Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide Dim result As Double = n1 / n2 Console.WriteLine("Received Divide({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function End Class End Namespace Ahora, el contrato de servicio se ha creado e implementado.Compile la solucin para asegurarse de que no hay ningn error de compilacin y, a continuacin, contine en Procedimiento para hospedar y ejecutar un servicio bsico de Windows Communication Foundationpara ejecutar el servicio.Para obtener informacin sobre la solucin de problemas, vea Solucin de problemas con el tutorial de introduccin.

    Compilar el cdigo Si usa Visual Studio, en el men Compilar, haga clic en Compilar solucin (o presione CTRL+MAYS+B).

    Procedimiento para hospedar y ejecutar un servicio bsico de Windows Communication Foundation .NET Framework 4.5

    Otras versiones

    Es la tercera de las seis tareas necesarias para crear una aplicacin de Windows Communication Foundation (WCF). Para obtener informacin general de las seis tareas, vea el tema Tutorial de introduccin. Este tema describe cmo hospedar un servicio de Windows Communication Foundation (WCF) en una aplicacin de consola. Este procedimiento consta de los siguientes pasos:

  • Cree un proyecto de aplicacin de consola para hospedar el servicio. Crear un host del servicio para el servicio. Habilitar el intercambio de metadatos. Abrir el host del servicio.

    En el ejemplo que se ofrece despus del procedimiento, se proporciona una lista completa del cdigo escrito en esta tarea. Para crear una nueva aplicacin de consola para hospedar el servicio

    1. Cree un nuevo proyecto de aplicacin de consola haciendo clic con el botn secundario en la solucin Introduccin, y seleccionando Agregar y Nuevo proyecto. En la parte izquierda del cuadro de dilogo Agregar nuevo proyecto, seleccione Ventanas en C# o VB.En la seccin central del cuadro de dilogo, seleccione Aplicacin de consola. Asigne al proyecto el nombre GettingStartedHost.

    2. Establezca la versin de .NET Framework de destino del proyecto GettingStartedHost en .NET Framework 4.5 haciendo clic con el botn secundario en GettingStartedHost en el Explorador de soluciones y seleccionando Propiedades. En el cuadro desplegable Versin de .NET Framework de destino, seleccione .NET Framework 4.5. Establecer la versin de .NET Framework de destino de un proyecto de VB es algo diferente; en el cuadro de dilogo de propiedades del proyecto GettingStartedHost, haga clic en la pestaa Compilaren el lado izquierdo de la pantalla y haga clic en el botn Opciones de compilacin avanzadas en la esquina izquierda inferior del cuadro de dilogo. Seleccione .NET Framework 4.5 en el cuadro desplegable Versin de .NET Framework de destino. Establecer la versin de .NET Framework de destino har que Visual Studio 2012 recargue la solucin; haga clic en Aceptar cuando se le pida.

    3. Agregue una referencia al proyecto GettingStartedLib al proyecto GettingStartedHost haciendo clic con el botn secundario en la carpeta Referencias bajo el proyecto GettingStartedHost en el explorador de soluciones y seleccione Agregar referencia. En el lado izquierdo del cuadro de dilogo Agregar referencia , seleccione Solucin y seleccione GettingStartedLib en la seccin central del cuadro de dilogo y haga clic en Agregar. Esto hace que los tipos definidos en GettingStartedLib estn disponibles para el proyecto GettingStartedHost.

    4. Agregue una referencia a System.ServiceModel al proyecto GettingStartedHost haciendo clic con el botn secundario en la carpeta Referencia bajo el proyecto GettingStartedHost en el Explorador de soluciones y seleccione Agregar referencia. En el cuadro de dilogoAgregar referencia, seleccione Framework en el lado izquierdo del cuadro de dilogo. En el cuadro de texto Ensamblados de bsqueda, escriba System.ServiceModel. En la seccin central del cuadro de dilogo, seleccione System.ServiceModel, haga clic en el botn Agregar y haga clic en el botn Cerrar. Guarde la solucin haciendo clic en el botn Guardar todo debajo del men principal.

    Para hospedar el servicio Abra el archivo Program.cs o Module.vb y escriba el cdigo siguiente: // program.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using GettingStartedLib; using System.ServiceModel.Description; namespace GettingStartedHost { class Program

  • { static void Main(string[] args) { // Step 1 Create a URI to serve as the base address. Uri baseAddress = new

    Uri("http://localhost:8000/GettingStarted/"); // Step 2 Create a ServiceHost instance ServiceHost selfHost = new ServiceHost(typeof(CalculatorService),

    baseAddress); try { // Step 3 Add a service endpoint. selfHost.AddServiceEndpoint(typeof(ICalculator), new

    WSHttpBinding(), "CalculatorService"); // Step 4 Enable metadata exchange. ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; selfHost.Description.Behaviors.Add(smb); // Step 5 Start the service. selfHost.Open(); Console.WriteLine("The service is ready."); Console.WriteLine("Press to terminate service."); Console.WriteLine(); Console.ReadLine(); // Close the ServiceHostBase to shutdown the service. selfHost.Close(); } catch (CommunicationException ce) { Console.WriteLine("An exception occurred: {0}", ce.Message); selfHost.Abort(); } } } } Module1.vb Imports System Imports System.ServiceModel Imports System.ServiceModel.Description Imports GettingStartedLibVB.GettingStartedLib Module Service

  • Class Program Shared Sub Main() ' Step 1 Create a URI to serve as the base address Dim baseAddress As New

    Uri("http://localhost:8000/ServiceModelSamples/Service") ' Step 2 Create a ServiceHost instance Dim selfHost As New ServiceHost(GetType(CalculatorService),

    baseAddress) Try ' Step 3 Add a service endpoint ' Add a service endpoint selfHost.AddServiceEndpoint( _ GetType(ICalculator), _ New WSHttpBinding(), _ "CalculatorService") ' Step 4 Enable metadata exchange. Dim smb As New ServiceMetadataBehavior() smb.HttpGetEnabled = True selfHost.Description.Behaviors.Add(smb) ' Step 5 Start the service selfHost.Open() Console.WriteLine("The service is ready.") Console.WriteLine("Press to terminate service.") Console.WriteLine() Console.ReadLine() ' Close the ServiceHostBase to shutdown the service. selfHost.Close() Catch ce As CommunicationException Console.WriteLine("An exception occurred: {0}", ce.Message) selfHost.Abort() End Try End Sub End Class End Module

    1. Paso 1 - Crea una instancia de la clase Uri para contener la direccin base del servicio.Los servicios se identifican mediante una direccin URL que contiene una direccin base y un URI opcional.Se da formato a la direccin base como sigue: [transporte]://[nombre de equipo o dominio][:n de puerto opcional]/[segmento opcional de URI]La direccin base para el servicio de calculadora usa el transporte HTTP, localhost, el puerto 8000 y el segmento de URI GettingStarted.

  • 2. Paso 2 - Crea una instancia de la clase ServicHost para hospedar el servicio.El constructor toma dos parmetros: el tipo de la clase que implementa el contrato de servicio y la direccin base del servicio.

    3. Paso 3 - Crea una nueva instancia de ServiceEndpoint.Un extremo de servicio consta de una direccin, un enlace y un contrato de servicio.Por tanto, el constructor ServiceEndpoint toma el tipo de interfaz del contrato de servicio, un enlace y una direccin.El contrato de servicio es ICalculator, que se define e implemente en el tipo de servicio.El enlace usado en este ejemplo es WSHttpBinding, que es un enlace integrado que se emplea para conectarse a extremos que son conformes a las especificaciones de WS-*.Para obtener ms informacin sobre los enlaces de WCF, vea Informacin general de enlaces de Windows Communication Foundation.La direccin se anexa a la direccin base para identificar el extremo.La direccin especificada en este cdigo es Calculator, por lo que la direccin completa del extremo es http://localhost:8000/GettingStartedService/Calculator.

    Importante

    Agregar un extremo de servicio es opcional cuando se usa .NET Framework 4 o posterior.En esta para cada combinacin de direccin base y contrato implementada por el servicio.Para obtener m informacin sobre los extremos, enlaces y comportamientos predeterminados, vea Configuracin

    4. Paso 4 - Habilita el intercambio de metadatos.Los clientes usarn intercambio de metadatos para generar los servidores proxy que se usarn para llamar a las operaciones de servicio.Para habilitar el intercambio de metadatos, cree una instancia deServiceMetadataBehavior, establezca su propiedad HttpGetEnabled en true y agregue el comportamiento a la coleccin Behaviors de la instancia de ServiceHost.

    5. Paso 5 - Abre ServiceHost para escuchar los mensajes entrantes.Observe que el cdigo espera que el usuario presione ENTRAR.Si no lo hace, la aplicacin se cerrar inmediatamente y el servicio se cerrar. Observe tambin que se usa un bloque try/catch.Una vez creada la instancia de ServiceHost, el resto del cdigo se coloca en un bloque try/catch.Para obtener ms informacin sobre cmo detectar de forma segura excepciones producidas por ServiceHost, vea Evitar problemas mediante una declaracin de instruccin.

    Para comprobar si el servicio funciona 1. Ejecute la aplicacin de consola GettingStartedHost desde Visual Studio 2012. Al ejecutarse en Windows

    Vista y sistemas operativos posteriores, el servicio se debe ejecutar con privilegios de administrador. Dado que Visual Studio se ejecut con privilegios de administrador, GettingStartedHost tambin se ejecuta con dichos privilegios. Tambin puede iniciar un nuevo smbolo del sistema con privilegios de administrador y ejecutar service.exe desde all.

    2. Abra Internet Explorer y busque la pgina de depuracin del servicio en http://localhost:8000/GettingStarted/CalculatorService.

    Ejemplo El siguiente ejemplo incluye el contrato de servicio y la implementacin de los pasos anteriores del tutorial y hospeda el servicio en una aplicacin de consola. Para compilar esto con un compilador de lnea de comandos, compile IService1.cs y Service2.cs en una biblioteca de clases haciendo referencia a System.ServiceModel.dll. Y compile Program.cs en una aplicacin de consola. // IService1.cs

  • using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace GettingStartedLib { [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); } } // Service1.cs using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.Text; namespace GettingStartedLib { public class CalculatorService : ICalculator { public double Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("Received Add({0},{1})", n1, n2); // Code added to write output to the console window. Console.WriteLine("Return: {0}", result); return result; } public double Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("Received Subtract({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result);

  • return result; } public double Multiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("Received Multiply({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Divide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("Received Divide({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } } } //Program.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using GettingStartedLib; using System.ServiceModel.Description; namespace GettingStartedHost { class Program { static void Main(string[] args) { // Step 1 of the address configuration procedure: Create a URI to serve as the base address. Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service"); // Step 2 of the hosting procedure: Create ServiceHost ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress); try { // Step 3 of the hosting procedure: Add a service endpoint.

  • selfHost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "CalculatorService"); // Step 4 of the hosting procedure: Enable metadata exchange. ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; selfHost.Description.Behaviors.Add(smb); // Step 5 of the hosting procedure: Start (and then stop) the service. selfHost.Open(); Console.WriteLine("The service is ready."); Console.WriteLine("Press to terminate service."); Console.WriteLine(); Console.ReadLine(); // Close the ServiceHostBase to shutdown the service. selfHost.Close(); } catch (CommunicationException ce) { Console.WriteLine("An exception occurred: {0}", ce.Message); selfHost.Abort(); } } } } IService1.vb Imports System Imports System.ServiceModel Namespace GettingStartedLib _ Public Interface ICalculator _ Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double _ Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double _ Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double _ Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double End Interface End Namespace Service1.vb

  • Imports System Imports System.ServiceModel Namespace GettingStartedLib Public Class CalculatorService Implements ICalculator Public Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Add Dim result As Double = n1 + n2 ' Code added to write output to the console window. Console.WriteLine("Received Add({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function Public Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Subtract Dim result As Double = n1 - n2 Console.WriteLine("Received Subtract({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function Public Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Multiply Dim result As Double = n1 * n2 Console.WriteLine("Received Multiply({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function Public Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double Implements ICalculator.Divide Dim result As Double = n1 / n2 Console.WriteLine("Received Divide({0},{1})", n1, n2) Console.WriteLine("Return: {0}", result) Return result End Function End Class End Namespace Module1.vb

  • Imports System Imports System.ServiceModel Imports System.ServiceModel.Description Imports GettingStartedLibVB.GettingStartedLib Module Service Class Program Shared Sub Main() ' Step 1 of the address configuration procedure: Create a URI to serve as the base address. Dim baseAddress As New Uri("http://localhost:8000/ServiceModelSamples/Service") ' Step 2 of the hosting procedure: Create ServiceHost Dim selfHost As New ServiceHost(GetType(CalculatorService), baseAddress) Try ' Step 3 of the hosting procedure: Add a service endpoint. ' Add a service endpoint selfHost.AddServiceEndpoint( _ GetType(ICalculator), _ New WSHttpBinding(), _ "CalculatorService") ' Step 4 of the hosting procedure: Enable metadata exchange. ' Enable metadata exchange Dim smb As New ServiceMetadataBehavior() smb.HttpGetEnabled = True selfHost.Description.Behaviors.Add(smb) ' Step 5 of the hosting procedure: Start (and then stop) the service. selfHost.Open() Console.WriteLine("The service is ready.") Console.WriteLine("Press to terminate service.") Console.WriteLine() Console.ReadLine() ' Close the ServiceHostBase to shutdown the service. selfHost.Close() Catch ce As CommunicationException Console.WriteLine("An exception occurred: {0}", ce.Message) selfHost.Abort() End Try End Sub End Class

  • End Module

    Nota

    Servicios como este requieren permiso para registrar las direcciones HTTP en el equipo para la realizacin de es tener concedido permiso para los espacios de nombres HTTP.Para obtener ms informacin sobre cmo configu the service.exe se debe ejecutar con privilegios de administrador.

    Ahora, el servicio se est ejecutando.Contine en Creacin de un cliente de Windows Communication Foundation.Para obtener ms informacin, vea Solucin de problemas con el tutorial de introduccin.

    Creacin de un cliente de Windows Communication Foundation .NET Framework 4.5 Otras versiones

    Es la cuarta de las seis tareas necesarias para crear una aplicacin de Windows Communication Foundation (WCF). Para obtener informacin general de las seis tareas, vea el tema Tutorial de introduccin. En este tema se describe cmo se pueden recuperar metadatos desde un servicio WCF y usarlos para crear un proxy WCF que pueda obtener acceso al servicio. Esta tarea se completa usando la funcionalidad Agregar referencia de servicio proporcionada por Visual Studio. Esta herramienta obtiene los metadatos del extremo MEX del servicio y genera un archivo de cdigo fuente administrado para un proxy de cliente en el lenguaje elegido (C# de forma predeterminada). Adems de crear el proxy de cliente, la herramienta tambin crea o actualiza el archivo de configuracin para el cliente que permite que la aplicacin cliente se conecte al servicio en uno de sus extremos.

    Nota

    Tambin puede usar la herramienta Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) para ge Studio.

  • Precaucin

    Cuando se llama a un servicio de WCF desde un proyecto de biblioteca de clases de Visual Studio 2012 puede u configuracin asociado. El archivo de configuracin no lo usar el proyecto de biblioteca de clases. Necesitar a la biblioteca de clases.

    La aplicacin cliente usa la clase de proxy generada para comunicarse con el servicio. Este procedimiento se describe en Cmo usar un cliente de Windows Communication Foundation. Creacin de un cliente de Windows Communication Foundation

    1. Cree un nuevo proyecto de aplicacin de consola haciendo clic con el botn secundario en la solucin Introduccin, y seleccionando Agregar y Nuevo proyecto. En la parte izquierda del cuadro de dilogo Agregar nuevo proyecto, seleccione Ventanas en C# o VB.En la seccin central del cuadro de dilogo, seleccione Aplicacin de consola. Asigne al proyecto el nombre GettingStartedClient.

    2. Establezca la versin de .NET Framework de destino del proyecto GettingStartedClient en .NET Framework 4.5 haciendo clic con el botn secundario en GettingStartedClient en el Explorador de soluciones y seleccionando Propiedades. En el cuadro desplegableVersin de .NET Framework de destino, seleccione .NET Framework 4.5. Establecer la versin de .NET Framework de destino de un proyecto de VB es algo diferente; en el cuadro de dilogo de propiedades del proyecto GettingStartedClient, haga clic en la pestaaCompilar en el lado izquierdo de la pantalla y haga clic en el botn Opciones de compilacin avanzadas en la esquina izquierda inferior del cuadro de dilogo. Seleccione .NET Framework 4.5 en el cuadro desplegable Versin de .NET Framework de destino. Establecer la versin de .NET Framework de destino har que Visual Studio 2011 recargue la solucin; haga clic en Aceptar cuando se le pida.

    3. Agregue una referencia a System.ServiceModel al proyecto GettingStartedClient haciendo clic con el botn secundario en la carpeta Referencia bajo el proyecto GettingStartedClient en el Explorador de soluciones y seleccione Agregar referencia. En el cuadro de dilogo Agregar referencia, seleccione Framework en el lado izquierdo del cuadro de dilogo. En el cuadro de texto Ensamblados de bsqueda, escriba System.ServiceModel. En la seccin central del cuadro de dilogo, seleccione System.ServiceModel, haga clic en el botn Agregar y haga clic en el botn Cerrar. Guarde la solucin haciendo clic en el botn Guardar todo debajo del men principal.

    4. Despus agregar una referencia de servicio al servicio de Calculadora. Antes de poder hacerlo, debe iniciar la aplicacin de consola GettingStartedHost. Una vez que el host est en funcionamiento, puede hacer clic con el botn secundario en la carpeta Referencias bajo el proyecto GettingStartedClient en el Explorador de soluciones y seleccionar Agregar referencia de servicio y escribir la direccin URL siguiente en el cuadro Direccin del cuadro de dilogo Agregar referencia de servicio: http://localhost:8000/ServiceModelSamples/Service y haga clic en el botn Ir. CalculatorService se deber mostrar en el cuadro de lista Servicios; haga doble clic en CalculatorService y se expandir y mostrar los contratos de servicio implementados por el servicio. Deje el espacio de nombres predeterminado como est y haga clic en el botn Aceptar. Cuando se agrega una referencia a un servicio usando Visual Studio, aparecer un nuevo elemento en el Explorador de soluciones bajo la carpeta Referencias de servicio bajo el proyecto GettingStartedClient. Si usa la herramienta Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe), se generar un archivo de cdigo fuente y un archivo app.config. Tambin puede usar la herramienta de lnea de comandos Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe) con los modificadores adecuados para crear el cdigo de cliente. El siguiente

  • ejemplo genera un archivo de cdigo y un archivo de configuracin para el servicio. El primer ejemplo muestra cmo generar el proxy en VB y el segundo muestra cmo generar el proxy en C#: svcutil.exe /language:vb /out:generatedProxy.vb /config:app.config http://localhost:8000/ServiceModelSamples/service

    C#

    svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config http://localhost:8000/ServiceModelSamples/service

    Ahora ha creado el proxy que la aplicacin cliente usar para llamar al servicio de calculadora. Contine con el siguiente tema de la serie: Configuracin de un cliente bsico de Windows Communication Foundation

    Configuracin de un cliente bsico de Windows Communication Foundation .NET Framework 4.5 Otras versiones

    Es la quinta de las seis tareas necesarias para crear una aplicacin bsica de Windows Communication Foundation (WCF). Para obtener informacin general de las seis tareas, vea el tema Tutorial de introduccin. Este tema explica el archivo de configuracin del cliente generado mediante la funcionalidad de Agregar referencia de servicio de Visual Studio 2012 o la Herramienta de utilidad de metadatos de ServiceModel (Svcutil.exe). La configuracin del cliente consiste en especificar el extremo que usa el cliente para obtener acceso al servicio. Un extremo tiene una direccin, un enlace y un contrato y cada uno de estos elementos debe especificarse en el proceso de configuracin del cliente. Configuracin de un cliente de Windows Communication Foundation

    1. Abra el archivo de configuracin generado (App.config) del proyecto GettingStartedClient. El siguiente ejemplo es una vista del archivo de configuracin generado. Bajo la seccin , busque el elemento .

    2. 3. 4.

  • 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 41. 42. 43.

  • 44. 45. 46. 47.

    Este ejemplo configura el extremo que el cliente usa para tener acceso al servicio que se ubica en la siguiente direccin: http://localhost:8000/ServiceModelSamples/Service/CalculatorService El elemento de extremo especifica que el contrato de servicio de ServiceReference1.ICalculator se usa para la comunicacin entre el cliente y el servicio de WCF.El canal de WCF se configura con el WsHttpBinding proporcionado por el sistema.Este contrato se gener mediante Agregar referencia de servicio en Visual Studio.Es bsicamente una copia del contrato que se defini en el proyecto GettingStartedLib.El enlace WsHttpBinding especifica HTTP como transporte, seguridad interoperable y otros detalles de configuracin.

    48. Para obtener ms informacin sobre uso del cliente generado con esta configuracin, vea Cmo usar un cliente de Windows Communication Foundation.

    Cmo usar un cliente de Windows Communication Foundation .NET Framework 4.5 Otras versiones

    Es la ltima de las seis tareas necesarias para crear una aplicacin bsica de Windows Communication Foundation (WCF). Para obtener informacin general de las seis tareas, vea el tema Tutorial de introduccin. Una vez creado y configurado un proxy de Windows Communication Foundation (WCF), se puede crear una instancia de cliente y la aplicacin de cliente se puede compilar y utilizar para comunicar con el servicio WCF. En este tema se describen los procedimientos para crear instancias y usar un cliente de WCF. Este procedimiento hace tres cosas:

    1. Crea una instancia de un cliente de WCF. 2. Llama a las operaciones de servicio desde el proxy generado. 3. Cierra el cliente una vez completada la llamada de operacin.

    Uso de un cliente de Windows Communication Foundation Abra el archivo Program.cs o Program.vb del proyecto GettingStartedClient y reemplace el cdigo

    existente por el cdigo siguiente: using System; using System.Collections.Generic; using System.Linq; using System.Text; using GettingStartedClient.ServiceReference1; namespace GettingStartedClient {

  • class Program { static void Main(string[] args) { //Step 1: Create an instance of the WCF proxy. CalculatorClient client = new CalculatorClient(); // Step 2: Call the service operations. // Call the Add service operation. double value1 = 100.00D; double value2 = 15.99D; double result = client.Add(value1, value2); Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); // Call the Subtract service operation. value1 = 145.00D; value2 = 76.54D; result = client.Subtract(value1, value2); Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2,

    result); // Call the Multiply service operation. value1 = 9.00D; value2 = 81.25D; result = client.Multiply(value1, value2); Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2,

    result); // Call the Divide service operation. value1 = 22.00D; value2 = 7.00D; result = client.Divide(value1, value2); Console.WriteLine("Divide({0},{1}) = {2}", value1, value2,

    result); //Step 3: Closing the client gracefully closes the connection and

    cleans up resources. client.Close(); } } }

    Imports System Imports System.Collections.Generic Imports System.Text Imports System.ServiceModel Imports GettingStartedClientVB2.ServiceReference1

  • Module Module1 Sub Main() ' Step 1: Create an instance of the WCF proxy Dim Client As New CalculatorClient() 'Step 2: Call the service operations. 'Call the Add service operation. Dim value1 As Double = 100D Dim value2 As Double = 15.99D Dim result As Double = Client.Add(value1, value2) Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result) 'Call the Subtract service operation. value1 = 145D value2 = 76.54D result = Client.Subtract(value1, value2) Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result) 'Call the Multiply service operation. value1 = 9D value2 = 81.25D result = Client.Multiply(value1, value2) Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result) 'Call the Divide service operation. value1 = 22D value2 = 7D result = Client.Divide(value1, value2) Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result) ' Step 3: Closing the client gracefully closes the connection and

    cleans up resources. Client.Close() Console.WriteLine() Console.WriteLine("Press to terminate client.") Console.ReadLine() End Sub End Module

    Observe la instruccin using o imports que importa GettingStartedClient.ServiceReference1.Esto importa el cdigo generado por Agregar referencia de servicio en Visual Studio.El cdigo crea una instancia del proxy de WCF y llama a cada una de las operaciones de servicio expuestas por el servicio de calculadora, cierra el proxy y finaliza.

  • Se ha completado el tutorial. Ha definido un contrato de servicio, implementado el contrato de servicio, generado un proxy WCF, configurado una aplicacin cliente de WCF y a continuacin usado el proxy para llamar a operaciones de servicio. Para probar la aplicacin, ejecute primero GettingStartedHost para iniciar el servicio y ejecute despus GettingStartedClient. La salida de GettingStartedHost debe ser similar a: El servicio est listo. Presione para finalizar el servicio.Suma recibida(100,15.99)Resultado: 115.99Resta recibida(145,76.54)Resultado: 68.46Multiplicacin recibida (9,81.25)Resultado: 731.25Divisin recibida (22,7)Resultado: 3.14285714285714 La salida de GettingStartedClient debe ser similar a: Add(100,15.99) = 115.99Subtract(145,76.54) = 68.46Multiply(9,81.25) = 731.25Divide(22,7) = 3.14285714285714Presione para terminar el cliente.

    Solucin de problemas con el tutorial de introduccin .NET Framework 4.5

    Otras versiones

    En este tema se enumeran los problemas ms comunes que se producen al desarrollar el Tutorial de introduccin y se explica cmo resolverlos.

    1. Los archivos del proyecto no se encuentran en el disco duro. 2. Se intent ejecutar la aplicacin de servicio: HTTP no pudo registrar la direccin URL

    http://+:8000/ServiceModelSamples/Service/. Su proceso no tiene los derechos de acceso a este espacio de nombres.

    3. Se intent usar la herramienta Svcutil.exe: 'svcutil' no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.

    4. No se encuentra el archivo App.config generado por Svcutil.exe. 5. Compilacin de la aplicacin cliente: 'CalculatorClient' no contiene una definicin de '' ni se encontr ningn mtodo de extensin '

  • 7. Excepcin no controlada: System.ServiceModel.EndpointNotFoundException: no se puede establecer conexin con http://localhost:8000/ServiceModelSamples/Service/CalculatorService. Cdigo de error TCP 10061: no se estableci ninguna conexin porque el equipo de destino la rechaz.

    Los archivos del proyecto no se encuentran en el disco duro. Visual Studio guarda los archivos de proyecto en c:\users\

  • Compilacin de la aplicacin cliente: 'CalculatorClient' no contiene una definicin de '' ni se encontr ningn mtodo de extensin '' que acepte un primer argumento de tipo 'CalculatorClient' (falta una directiva using o una referencia de ensamblado?) Slo los mtodos que se marcan con ServiceOperationAttribute se exponen al exterior. Si omiti el atributo ServiceOperationAttribute en uno de los mtodos de la interfaz ICalculator, aparece este mensaje de error al compilar una aplicacin cliente que realice una llamada a la operacin que no tiene el atributo.

    Compilacin de la aplicacin cliente: no se puede encontrar el tipo o el nombre de espacio de nombres 'CalculatorClient' (falta una directiva using o una referencia de ensamblado?) Este error se produce si no se agrega el archivo Proxy.cs o Proxy.vb a su proyecto de cliente.

    Ejecucin del cliente: excepcin no controlada: System.ServiceModel.EndpointNotFoundException: no se puede establecer conexin con http://localhost:8000/ServiceModelSamples/Service/CalculatorService.Cdigo de error TCP 10061: no se estableci ninguna conexin porque el equipo de destino la rechaz. Este error se produce si se ejecuta la aplicacin cliente sin ejecutar el servicio.

    Excepcin no controlada: System.ServiceModel.Security.SecurityNegotiationException: error de negociacin de seguridad SOAP con 'http://localhost:8000/ServiceModelSamples/Service/CalculatorService' para el destino 'http://localhost:8000/ServiceModelSamples/Service/CalculatorService' Este error se produce en un equipo unido a un dominio que no dispone de conectividad de red. Conecte el equipo a la red o desactive la seguridad para el cliente y el servicio. En el servicio, modifique el cdigo que crea el WSHttpBinding de la manera siguiente. // Step 3 of the hosting procedure: Add a service endpoint selfhost.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(SecurityMode.None), "CalculatorService");

  • En el cliente, cambie el elemento debajo del elemento de la manera siguiente:

    Definicin de un contrato de servicio de Windows Communication FoundationPara definir un contrato de servicio

    Cmo implementar un contrato de servicio de Windows Communication FoundationPara implementar un contrato de servicio WCFEjemploCompilar el cdigo

    Procedimiento para hospedar y ejecutar un servicio bsico de Windows Communication FoundationPara crear una nueva aplicacin de consola para hospedar el servicioPara hospedar el servicioPara comprobar si el servicio funcionaEjemplo

    Creacin de un cliente de Windows Communication FoundationCreacin de un cliente de Windows Communication Foundation

    Configuracin de un cliente bsico de Windows Communication FoundationConfiguracin de un cliente de Windows Communication Foundation

    Cmo usar un cliente de Windows Communication FoundationUso de un cliente de Windows Communication Foundation

    Solucin de problemas con el tutorial de introduccinLos archivos del proyecto no se encuentran en el disco duro.Se intent ejecutar la aplicacin de servicio: HTTP no pudo registrar la direccin URL http://+:8000/ServiceModelSamples/Service/.Su proceso no tiene los derechos de acceso a este espacio de nombres.Se intent usar la herramienta Svcutil.exe: 'svcutil' no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutable.No se encuentra el archivo App.config generado por Svcutil.exe.Compilacin de la aplicacin cliente: 'CalculatorClient' no contiene una definicin de '' ni se encontr ningn mtodo de extensin '' que acepte un primer argumento de tipo 'CalculatorClient' (falta una directiva ...Compilacin de la aplicacin cliente: no se puede encontrar el tipo o el nombre de espacio de nombres 'CalculatorClient' (falta una directiva using o una referencia de ensamblado?)Ejecucin del cliente: excepcin no controlada: System.ServiceModel.EndpointNotFoundException: no se puede establecer conexin con http://localhost:8000/ServiceModelSamples/Service/CalculatorService.Cdigo de error TCP 10061: no se estableci ninguna ...Excepcin no controlada: System.ServiceModel.Security.SecurityNegotiationException: error de negociacin de seguridad SOAP con 'http://localhost:8000/ServiceModelSamples/Service/CalculatorService' para el destino 'http://localhost:8000/ServiceModelSam...