Ejemplo de programación web avanzada
Este ejemplo muestra algunas de las características más avanzadas del modelo de programación web de Windows Communication Foundation (WCF). El ejemplo presenta los conceptos siguientes:
Uri Template Dispatch, permite enlazar las operaciones del servicio a los URI externos que coinciden con un modelo especificado.
HTTP Methods, los métodos HTTP arbitrarios pueden invocar las operaciones del servicio, incluyendo a GET, PUT, POST, y DELETE.
HTTP Headers, servicios que pueden manipular el contenido de encabezados HTTP utilizando WebOperationContext.
Nota
Para generar y ejecutar este ejemplo, es necesario que esté instalado .NET Framework versión 3.5. Para abrir los archivos de solución y proyecto se necesita Visual Studio 2008.
El ejemplo implementa una colección básica de datos del cliente, almacenada en memoria. Admite Create
básico, Read
, Update
y operaciones Delete
que se exponen utilizando externamente URI y los métodos HTTP.
Contrato del servicio e implementación
En este ejemplo, el servicio implementa un extremo único que realiza escuchas en una dirección de la Dirección URI base (https://localhost:8000/Customers). El servicio administra las solicitudes para URI debajo de ese prefijo de las maneras siguientes:
Las solicitudes GET a https://localhost:8000/Customers se enrutan hacia
GetCustomers()
.Cada cliente en el sistema tiene un identificador único, que se lleva en el URI. Las solicitudes GET para estos URI (por ejemplo, https://localhost:8000/Customers/1) están asignadas a
GetCustomer()
.Los clientes individuales pueden estar actualizados emitiendo una solicitud HTTP PUT al URI del cliente.
Un cliente puede eliminarse del sistema emitiendo un HTTP DELETE al URI del cliente.
Los Nuevos datos se pueden agregar al sistema emitiendo un HTTP POST a la dirección básica de URI.
[ServiceContract]
public interface ICustomerCollection
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "")]
Customer AddCustomer(Customer customer);
[OperationContract]
[WebInvoke(Method = "DELETE", UriTemplate = "{id}")]
void DeleteCustomer(string id);
[OperationContract]
[WebGet(UriTemplate = "{id}")]
Customer GetCustomer(string id);
[OperationContract]
[WebGet(UriTemplate = "")]
List<Customer> GetCustomers();
[OperationContract]
[WebInvoke(Method = "PUT", UriTemplate = "{id}")]
Customer UpdateCustomer(string id, Customer newCustomer);
}
La clase Service
, que utiliza la creación de instancias de semifallo WCF implementa el contrato de servicios. Todas las solicitudes recibidas se enrutan a la misma instancia de objeto en el servidor, permitiendo compartir la tabla hash del cliente entre las solicitudes.
[ServiceBehavior( InstanceContextMode = InstanceContextMode.Single )]
public class Service : ICustomerCollection
{
Hashtable customers = new Hashtable();
...
}
La operación GetCustomers()
se puede invocar emitiendo una solicitud HTTP GET a la dirección básica URI del servicio (por ejemplo, https://localhost:8000/Customers). El tipo Customer
se serializa con Data Contract Serializer.
public List<Customer> GetCustomers()
{
List<Customer> list = new List<Customer>();
foreach (Customer c in this.customers.Values)
{
list.Add(c);
}
return list;
}
Los clientes individuales se pueden recuperar emitiendo una solicitud GET al URI único del cliente. Por ejemplo, el cliente con id. 1 se puede recuperar en https://localhost:8000/Customers/1. De igual forma, se puede tener acceso al cliente 2 en http:/localhost:8000/Customers/2. Ambos URI se envían al método GetCustomer(string id)
en el servidor. El atributo [WebGet( UriTemplate="{id}")]
que se aplica al contrato de operación GetCustomer()
crea esta asignación. UriTemplate es un modelo que describe el conjunto de URI que la operación GetCustomer()
controla. En este caso, el modelo describe todos los URI que tienen exactamente un segmento que sigue la dirección base del extremo. El contenido de ese segmento coincide con la variable de plantilla {id}
y pasa por el distribuidor WCF en el id
de parámetro de método.
//[WebGet( UriTemplate=”{id}” )]
public Customer GetCustomer(string id)
{
Customer c = this.customers[id] as Customer;
if (c == null)
{
WebOperationContext.Current.OutgoingResponse.SetStatusAsNotFound();
return null;
}
return c;
}
La implementación GetCustomer()
consulta el id. del cliente (suministrado en el URI) y devuelve el cliente asociado. Si no se busca ningún cliente, la operación devuelve una respuesta HTTP 404 utilizando el método WebOperationContext para establecer el código de estado de la respuesta.
Observe que UpdateCustomer()
y los métodos DeleteCustomer()
también están asociados a la misma plantilla URI como el método GetCustomer()
. WCF el modelo de programación de web permite enlazar varias operaciones a la misma plantilla URI con tal de que estén cada una asociadas con un método HTTP diferente. En este caso, el método UpdateCustomer()
se enlaza al método Http PUT, mientras la operación DeleteCustomer()
se enlaza al método HTTP DELETE.
[OperationContract]
[WebInvoke( Method="PUT", UriTemplate="{id}")]
Customer UpdateCustomer(string id, Customer newCustomer);
[OperationContract]
[WebInvoke( Method="DELETE", UriTemplate="{id}" )]
void DeleteCustomer(string id);
El método AddCustomer()
muestra cómo utilizar la nueva clase UriTemplate para crear nuevos URI que siguen un modelo concreto. El método WebOperationContext()
se utiliza para devolver la respuesta Http CREATED con el encabezado Location establecido en el URI del cliente recientemente creado.
public Customer AddCustomer(Customer customer)
{
lock (writeLock)
{
counter++;
UriTemplateMatch match = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;
UriTemplate template = new UriTemplate("{id}");
customer.Uri = template.BindByPosition(match.BaseUri, counter.ToString());
customers[counter.ToString()] = customer;
WebOperationContext.Current.OutgoingResponse.SetStatusAsCreated(customer.Uri);
}
return customer;
}
Hospedaje de servicios
El servicio se hospeda utilizando WebServiceHost()
y un extremo se expone utilizando WebHttpBinding()
.
using (WebServiceHost host = new WebServiceHost(typeof(Service), new Uri("https://localhost:8000/")))
{
host.AddServiceEndpoint(typeof(ICustomerCollection), new WebHttpBinding(), "Customers");
host.Open();
...}
Cliente
El cliente se crea utilizando el método WebChannelFactory
para crear un canal al servicio remoto.
using (WebChannelFactory<ICustomerCollection> cf = new WebChannelFactory<ICustomerCollection>())
{
cf.Endpoint.Binding = new WebHttpBinding();
cf.Endpoint.Address = new EndpointAddress( baseAddress );
cf.Endpoint.Behaviors.Add(new WebHttpBehavior());
ICustomerCollection channel = cf.CreateChannel();
...
}
El cliente que utiliza el canal emite una serie de solicitudes al servidor, que manipula el estado de la colección de clientes.
Salida
Agregar algunos clientes con POST:
Alice 123 Pike Place https://localhost:8000/Customers/1
Bob 2323 Lake Shore Drive https://localhost:8000/Customers/2
Utilizando PUT para actualizar un cliente:
Charlie 123 Pike Place https://localhost:8000/Customers/1
Utilizar GET para recuperar la lista de clientes:
Charlie 123 Pike Place https://localhost:8000/Customers/1
Bob 2323 Lake Shore Drive https://localhost:8000/Customers/2
Utilizar DELETE para eliminar un cliente:
Lista final de clientes:
Charlie 123 Pike Place https://localhost:8000/Customers/1
Cuando la interacción ha finalizado, el programa espera la pulsación de una tecla y, a continuación, finaliza.
Para configurar, generar y ejecutar el ejemplo
Asegúrese de que ha realizado el Procedimiento de instalación único para ejemplos de Windows Communication Foundation.
Para generar el código C# o Visual Basic .NET Edition de la solución, siga las instrucciones de Generación de ejemplos de Windows Communication Foundation.
Para ejecutar el ejemplo en una configuración de equipos única o cruzada, siga las instrucciones de Ejecución de ejemplos de Windows Communication Foundation.
Consulte también
Otros recursos
Ejemplo de modelo de programación web básica
Copyright © 2007 Microsoft Corporation. Reservados todos los derechos.