WCF REST Starter Kit

Há algum tempo eu escrevi sobre a possibilidade de criar serviços REST em WCF. Visando incrementar esses tipos de serviços, a Microsoft disponibilizou recentemente o Windows Communication Foundation REST Stater Kit. Este kit fornece templates de projeto e diversas funcionalidades para serviços REST criados sob WCF. As funcionalidades fornecidas pelo kit facilita o uso do protocolo HTTP dentro do serviço e encapsula algumas funcionalidades expostas pelo ASP.NET. Entre as principais funcionalidades, temos caching, tratamento/manipulador de erros, página de suporte, estensibilidade, etc.

Todas as funcionalidades estão contidas no assembly Microsoft.ServiceModel.Web.dll. O caching funciona de forma muito parecida com o caching do ASP.NET/ASP.NET Web Services, pois foi criado um atributo chamado WebCacheAttribute que, podemos aplicar em algum método de nosso serviço. Exemplo:

[WebGet(UriTemplate = “”)]
[WebCache(Duration = 30)]
[OperationContract]
string RecuperarAlgumaInformacao();

Outra possibilidade que temos, é a criação de uma página de suporte, que traz informações relacionadas aos métodos que o serviço disponibiliza. Para acessá-la, basta colocar “/help” no final da URL do serviço que, automaticamente, uma “página amigável” será exibida com essas informações. Vale lembrar que voce poderá customizar a descrição de um determinado método, através do atributo  WebHelpAttribute, como é mostrado abaixo:

[WebGet(UriTemplate = “”)]
[WebHelp(Comment = “Retorna uma informação qualquer.”)]
[OperationContract]
string RecuperarAlgumaInformacao();

Alguns novos tipos também foram estendidos para suportar essas novas funcionalidades. Entre esses tipos, temos as classes WebServiceHost2, WebServiceHost2Factory e WebHttpBehavior2. Esses tipos são semelhantes aos existentes no .NET Framework 3.5, mais precisamente, dentro do Assembly System.ServiceModel.Web.dll. O WebServiceHost2 possui uma propriedade chamada Interceptors que, como o próprio nome diz, permite-nos acoplar um “interceptador” e colocar ali algum código que desejamos executar durante a requisição.  Para criar um interceptador, tudo o que precisamos fazer é herdar da classe abstrata RequestInterceptor e sobrescrever o método ProcessRequest, como é mostrado abaixo:

public class MeuInterceptador : RequestInterceptor
{
    public MeuInterceptador() : base(true) { }

    public override void ProcessRequest(ref RequestContext requestContext)
    {
        Message msg = requestContext.RequestMessage;
        //faz algo customizado aqui
    }
}

E, depois de criado, precisamos adicioná-lo na coleção de interceptors do WebServiceHost2, o que nos obriga a criar uma service factory customizada (atente-se a sua configuração), conforme é mostrado abaixo:

internal class AppServiceHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        WebServiceHost2 w = new WebServiceHost2(serviceType, true, baseAddresses);
        w.Interceptors.Add(new MeuInterceptador());
        return w;
    }
}

Anúncios

MemoryMappedFile

Por curiosidade, abri o .NET Reflector com o .NET Framework 4.0 e comecei a explorar as classes que ele disponibiliza e, logo percebi um novo namespace: System.IO.MemoryMappedFiles. Dentro deste namespace, entre as poucas classes, temos a classe MemoryMappedFile. É importante dizer que é uma versão CTP, sem a garantia de que isso prevalecerá na versão final.

A finalidade dela é mapear um espaço da memória para o conteúdo de um determinado arquivo (ou algum outro recurso), criando um objeto que servirá de “ponte” entre a aplicação e o arquivo físico, criandos “views” deste arquivo e, como principal benefício, permitirá acessar “seções” do arquivo, sem carregá-lo completamente para a memória. Abaixo um exemplo simples que faz a utilização desta classe:

using System.IO;
using System.IO.MemoryMappedFiles

using (MemoryMappedFile mmf = 
    MemoryMappedFile.CreateFromFile(new FileStream(“C:Teste.txt”, FileMode.Open)))
{
    byte[] buffer = new byte[5];
    mmf.CreateViewStream(120, 5).Read(buffer, 0, 5);
    Console.WriteLine(Encoding.Default.GetString(buffer));
}

O primeiro parametro do método CreateViewStream é a posição inicial dentro do arquivo e, o segundo, a quantidade de caracteres que voce quer extrair.