Controle de instâncias entre requisições de serviços WCF

O WCF provê três modelos diferente de controle de instâncias, sendo estes modelos:

Per call instance mode – Uma nova instância do serviço WCF é criada para cada chamada de método invocada por um cliente e destruida após a resposta ser enviada.

Per session instance mode – Apenas uma instância de um serviço é criada para um conjunto de integrações com o cliente. A instância do serviço só é destruída quando o cliente termina suas requisições.

Single instance mode – Uma instância global do serviço é criada, e desta forma fica responsável por receber e processar todas as requisições de todos os clientes.

Saiba mais

Sobre estes anúncios

ASP.Net Web Services e SOAP Headers (ASP.Net Web Services and SOAP Headers)

A comunicação utilizando o formato SOAP é a prática mais comum de implementação ao construirmos web services.

SOAP Headers (cabeçalhos SOAP) são uma maneira diferente de passarmos dados para um web service caso os dados não estejam diretamente relacionados à funcionalidade primária do web method que estamos invocando.

A utilização de SOAP Headers é indicada quando temos de customizar o modo de autenticação de nossos serviços. Ao invés de criarmos parâmetros em nossos Web Methods para autenticação, nós podemos exigir a passagem de um SOAP Header com os dados necessários para autenticação.

Para utilizarmos SOAP Headers como parte do modelo de autenticação de nossos web services, devemos:

1º – Criar uma classe que encapsule os dados que devem transitar no SOAP Header, e fazer a mesma herdar de “System.Web.Services.Protocols.SoapHeader”

using System.Web.Services.Protocols;

public class WorkerAuth : SoapHeader
{
public string User { get; set; }

public string Password { get; set; }
}

2º – Adicionar ao serviço uma propriedade pública que faça referência a entidade que representa o nosso SOAP Header.

[WebService(Namespace = “http://tempuri.org/”)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WorkerService : System.Web.Services.WebService
{
/// <summary>
/// Entidade de autenticação…
/// Deve conter os dados que são transitados
/// entre o cabeçalho das requisições…
/// </summary>
public WorkerAuth Authentication { get; set; }
}

3º – Marcar em nossos web methods com qual SOAP Header eles devem trabalhar, através do atributo “System.Web.Services.Protocols.SoapHeaderAttribute”…

using System.Web.Services.Protocols;

[WebService(Namespace = “http://tempuri.org/”)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WorkerService : System.Web.Services.WebService
{
/// <summary>
/// Entidade de autenticação…
/// Deve conter os dados que são transitados
/// entre o cabeçalho das requisições…
/// </summary>
public WorkerAuth Authentication { get; set; }

/// <summary>
/// Método de exemplo, deve retornar possíveis
/// funcionários cadastrados…
/// </summary>
[WebMethod]
[SoapHeaderAttribute(“Authentication”)]
public Employee[] GetEmployees()
{
return Employee.GetAll();
}
}

4º – Adicionar aos nossos web methods as regras de negócios necessárias para validação das informações trafegadas no SOAP Header…

using System.Web.Services.Protocols;

[WebService(Namespace = “http://tempuri.org/”)]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
public class WorkerService : System.Web.Services.WebService
{
/// <summary>
/// Entidade de autenticação…
/// Deve conter os dados que são transitados
/// entre o cabeçalho das requisições…
/// </summary>
public WorkerAuth Authentication { get; set; }

/// <summary>
/// Método de exemplo, deve retornar possíveis
/// funcionários cadastrados…
/// </summary>
[WebMethod]
[SoapHeaderAttribute(“Authentication”)]
public Employee[] GetEmployees()
{
AuthenticateRequest(this.Authentication);
return Employee.GetAll();
}

private void AuthenticateRequest(WorkerAuth soapHeader)
{
if (soapHeader == null)
throw new InvalidOperationException(“Could not authenticate request.”);

if ((string.Compare(soapHeader.User, “usuario”, false) != 0) ||
(string.Compare(soapHeader.Password, “abc”, false) != 0))
throw new InvalidOperationException(“Invalid access request.”);
}
}

5º – Executar chamadas ao web service utilizando SOAP Headers…

using WebAuthSample;
using System.Web.Services.Protocols;

class Program
{
static void Main(string[] args)
{
try
{
WorkerService objWeb = null;
WorkerAuth objHeader = null;
Employee[] employess = null;

objHeader = new WorkerAuth();
objHeader.User = “usuario”;
objHeader.Password = “abc”;

objWeb = new WorkerService();
objWeb.Url = “http://localhost:1814/WorkerService.asmx”;
objWeb.WorkerAuthValue = objHeader;

employess = objWeb.GetEmployees();
}
catch (SoapException ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
}
}
}

Para fazer o download do exemplo acesse o link: SOAP Headers

obs.: Não é aconselhável a passagem de dados sigilosos entre requisições sem a utilização de criptografia e outras técnicas de segurança. Como o tema deste post não se refere a tais tópicos eles não foram abordados por simplificação e enfoque no tema abordado.

Referências:
SoapHeaderAttribute Class – http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapheaderattribute.aspx

SoapHeader Class – http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapheader.aspx

Using SOAP Headers – http://msdn.microsoft.com/en-us/library/77hkfhh8%28VS.71%29.aspx

Authentication for Web Services (using SOAP headers) – http://www.codeproject.com/KB/cpp/authforwebservices.aspx

Microsoft Press – Microsoft-Training Kit-.Net Framework 3.5-ASP.Net Application Development

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Junte-se a 70 outros seguidores