Académique Documents
Professionnel Documents
Culture Documents
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.
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.
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.
}
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
Ejemplo
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
Compilar el cdigo
Si usa Visual Studio, en el men Compilar, haga clic en Compilar solucin (o presione CTRL+MAYS+B).
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:
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.
{
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")
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.
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
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.
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
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.
5.
6.
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.
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.
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);
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
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.
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.
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.
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
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.
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" />