Vous êtes sur la page 1sur 28

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.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.

IService.vb
Imports System
Imports System.ServiceModel
Namespace GettingStartedLib
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Divide(ByVal n1 As Double, ByVal n2 As Double) As Double
End Interface
End Namespace

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
using
using
using

System.Linq;
System.Runtime.Serialization;
System.ServiceModel;
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

<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
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.

2.

3.

4.

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.
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.
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.
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 <ENTER> 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 <ENTER> 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.

3.

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.
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.

5.

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.
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.

2.

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.
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
using
using
using
using
using

System;
System.Collections.Generic;
System.Linq;
System.Runtime.Serialization;
System.ServiceModel;
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 <ENTER> 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
<ServiceContract(Namespace:="http://Microsoft.ServiceModel.Samples")> _
Public Interface ICalculator
<OperationContract()> _
Function Add(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Subtract(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
Function Multiply(ByVal n1 As Double, ByVal n2 As Double) As Double
<OperationContract()> _
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
Imports
Imports
Imports

System
System.ServiceModel
System.ServiceModel.Description
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 <ENTER> 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.

2.

3.

4.

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.
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.
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.
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 <system.serviceModel>,
busque el elemento <endpoint>.
2. <?xml version="1.0" encoding="utf-8" ?>
3. <configuration>
4.
<startup>

5.
6.

<!-- specifies the version of WCF to use-->


<supportedRuntime version="v4.0"
sku=".NETFramework,Version=v4.5,Profile=Client" />
7.
</startup>
8.
<system.serviceModel>
9.
<bindings>
10.
<!-- Uses wsHttpBinding-->
11.
<wsHttpBinding>
12.
<binding name="WSHttpBinding_ICalculator" />
13.
</wsHttpBinding>
14.
</bindings>
15.
<client>
16.
<!-- specifies the endpoint to use when calling the service -->
17.
<endpoint
address="http://localhost:8000/ServiceModelSamples/Service/CalculatorService"
18.
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_ICalculator"
19.
contract="ServiceReference1.ICalculator"
name="WSHttpBinding_ICalculator">
20.
<identity>
21.
<userPrincipalName
value="migree@redmond.corp.microsoft.com" />
22.
</identity>
23.
</endpoint>
24.
</client>
25.
</system.serviceModel>
26. </configuration><?xml version="1.0" encoding="utf-8" ?>
27. <configuration>
28.
<startup>
29.
<supportedRuntime version="v4.0"
sku=".NETFramework,Version=v4.5,Profile=Client" />
30.
</startup>
31.
<system.serviceModel>
32.
<bindings>
33.
<wsHttpBinding>
34.
<binding name="WSHttpBinding_ICalculator" />
35.
</wsHttpBinding>
36.
</bindings>
37.
<client>
38.
<endpoint
address="http://localhost:8000/ServiceModelSamples/Service/CalculatorService"
39.
binding="wsHttpBinding"
bindingConfiguration="WSHttpBinding_ICalculator"
40.
contract="ServiceReference1.ICalculator"
name="WSHttpBinding_ICalculator">
41.
<identity>
42.
<userPrincipalName
value="migree@redmond.corp.microsoft.com" />
43.
</identity>

44.
</endpoint>
45.
</client>
46.
</system.serviceModel>
47. </configuration>
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
Imports
Imports
Imports
Imports

System
System.Collections.Generic
System.Text
System.ServiceModel
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 <ENTER> 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 <ENTRAR> 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 <ENTRAR> 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 '<nombre de
mtodo>' ni se encontr ningn mtodo de extensin '<'nombre de mtodo>' que acepte un primer
argumento de tipo 'CalculatorClient' (falta una directiva using o una referencia de ensamblado?)
6. 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?)

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\<nombre de usuario\Documents\<versin de Visual


Studio>\Projects en Windows Vista y en Windows 7, y en c:\Documents and Settings\<nombre de usuario>\My
Documents\<versin de Visual Studio>\Projects en versiones anteriores de Windows.

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.

El proceso que hospeda un servicio WCF se debe ejecutar con privilegios administrativos. Si est ejecutando el
servicio desde Visual Studio 2012, debe ejecutar Visual Studio 2012 como administrador. Para ello, haga clic
en Inicio, haga clic con el botn secundario en Visual Studio 2012 y seleccione Ejecutar

como

administrador. Si est ejecutando el servicio desde el smbolo de la lnea de comandos, debe iniciar el smbolo
del sistema como administrador de una forma similar. Haga clic en Inicio, haga clic con el botn secundario
enSmbolo del sistema y seleccione Ejecutar como administrador.

Se intent usar la herramienta Svcutil.exe: 'svcutil' no se


reconoce como un comando interno o externo, programa o
archivo por lotes ejecutable.

Svcutil.exe debe estar en la ruta de acceso del sistema. La solucin ms fcil es usar el smbolo del sistema. Haga
clic en Inicio, seleccione Todos

los programas, Visual Studio 2012, Visual Studio Tools y Visual Studio

2012 Smbolo del sistema. Este smbolo del sistema establece la ruta de acceso del sistema en las
ubicaciones correctas para todas las herramientas distribuidas como parte de Visual Studio 2012.

No se encuentra el archivo App.config generado por


Svcutil.exe.

El cuadro de dilogo Agregar elemento existente slo muestra de forma predeterminada los archivos con
las extensiones siguientes: .cs, .resx, .settings, .xsd, .wsdl. Puede especificar que desea ver todos los tipos de
archivos seleccionando Todos

los archivos (*.*) en el cuadro de lista desplegable situado en la esquina


inferior derecha del cuadro de dilogo Agregar elemento existente.

Compilacin de la aplicacin cliente: 'CalculatorClient' no


contiene una definicin de '<nombre de mtodo>' ni se
encontr ningn mtodo de extensin '<nombre de mtodo>'
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/Calculator
Service.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/Calculator
Service' para el destino
'http://localhost:8000/ServiceModelSamples/Service/Calculator
Service'
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 <security> debajo del elemento <binding> de la manera siguiente:
<security mode="Node" />

Vous aimerez peut-être aussi