Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

RSS iMasters

[Resolvido] Técnicas avançadas para usar o Generics Handler ASHX

Recommended Posts

 

Em ASP.net, temos algo que é normalmente negligenciado e que se chama Genéric Handlers. Eu vejo um monte de gente que utiliza páginas para processar solicitações de AJAX, quando podemos usar esse Endpont que é muito menos trabalhoso.

 

Esse é um Generic Handlers totalmente trabalhado e que realmente sabe como lidar com suas http (AJAX ou não) solicitadas.

Experiência

Por muito tempo eu usei o Genéric Handlers (ashx) simples para lidar com os meus pedidos AJAX, mas me pareceu estúpido e complicado. Quer dizer, a funcionalidade estava lá, mas todo o processo de tratamento dos pedidos não foi em frente.

Então, eu fiz uma lista das coisas que eu gostaria de ter e lidar:

  • Um modelo padrão para analisar a string de consulta;
  • Manipular transparentemente vários métodos dentro do mesmo handler;
  • Métodos de suporte com múltiplos argumentos digitados, não apenas strings;
  • Métodos de apoio que recebem listas como um argumento;
  • Dar suporte quando há passagem de menos argumentos do que o método está esperando (como parâmetros opcionais);
  • Resposta transparente tanto para POSTs ou GETs;
  • Suporte para serialização de objetos padrão JSON, mas ainda me deixar substituí-lo em cada método;
  • Retornar application/JSON por padrão, mas ainda me deixar substituí-lo em cada método;
  • Apoio JQuery $. Pedido ajax;
  • Pedido de apoio por string de consulta (URL à direita do navegador);
  • Uma forma de visualizar os métodos que o Handler suporta (como fazem os serviços web);
  • Extensível.

E é isso! Posso dizer de antemão que ele já faz tudo isso e talvez mais.

Usando o código

Listar os métodos Handler

 

Eu achei um meio muito básico de listar os métodos que o Handler expõe. Isso é especialmente útil para testar se o handler está funcionando corretamente (como nos serviços web). Ele só acrescenta o ?help ao final do URL handler.

http://localhost/mydemohandler.ashx?help

 

Chamando o Handler da URL do navegador

Utilizar esses handles é muito simples:

 

  • Criar um novo Generic Handler;
  • Limpar tudo dentro da classe handler;
  • Herdar da minha classe Handler;
  • FEITO! Agora você só precisa adicionar os seus métodos.

Vamos criar um exemplo muito simples que recebe um nome e retorna uma string (ver no projeto).

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using App.Utilities.Web.Handlers;

 

namespace CodeProject.GenericHandler

{

public class MyFirstHandler : BaseHandler

{

// I don't bother specifying the return type, it'll be serialized anyway

public object GreetMe(string name)

{

return string.Format("Hello {0}!", name);

}

}

}

Para chamar esse método através de uma URL, utilize:

MyFirstHandler.ashx?method=GreetMe&name=AlexCode

Pedido AJAX usando Jquery

Se você quiser usar o método AJAX JQuery, você só precisa conhecer o objeto que o handler está esperando. Na propriedade dos dados do pedido ajax $, você deve passar algo tipo:

 

{ method: 'O método  que quer chamar', args: { os argumentos para passar } }

Esteja ciente de que tudo é sensível a letras maiúsculas!

$.ajax({

url: 'MyFirstHandler.ashx',

type: 'GET',

data: { method: 'GreetMe', args: { name: 'AlexCode'} },

success: function (data) {

alert(data);

}

});

Escrevendo um método que retorna HTML

Como eu disse, preciso ter alguns métodos que retornem o que eu quiser, como HTML, XML, imagens, arquivos etc...

 

O comportamento padrão do handler é retornar JSON, então, pelo método, precisamos dizer explicitamente que queremos lidar com as coisas do nosso jeito. Para isso, basta usar estas linhas em qualquer lugar dentro do método:

SkipContentTypeEvaluation = true;

SkipDefaultSerialization = true;

 

// you can specify the response content type as follows

context.Response.ContentType = "text/html";

 

Vamos ver um exemplo de como nós poderíamos escrever um método no handler que retorna HTML:

public object GiveMeSomeHTML(string text)

{

StringBuilder sb = new StringBuilder();

sb.Append("<head><title>My Handler!</title></head>");

sb.Append("<body>");

sb.Append("

This is a HTML page returned from the Handler

");

sb.Append("

The text passed was: " + text + "

");

sb.Append("</body>");

 

context.Response.ContentType = "text/html";

SkipContentTypeEvaluation = true;

SkipDefaultSerialization = true;

 

return sb.ToString();

}

Parâmetros opcionais e tipos anuláveis

Todos os parâmetros nos métodos são opcionais. Se eles não são passados, o valor padrão deles é atribuído.Todos os parâmetros também podem ser anuláveis. Nesse caso, o valor padrão será nulo.

Por favor, dê uma olhada no código de exemplo em anexo para mais exemplos.

 

Pontos de interesse

Posso dizer que esse handler já me poupou uma boa quantidade de horas de desenvolvimento e manutenção.

Atualmente, todos os meus pedidos de AJAX apontam para um método em um handler como este.

 

História

  • v1.0 - A primeira versão completamente aberta;
  • Este é um trabalho em progresso, continuarei melhorando-o regularmente.

Eu não tenho nenhuma dúvida de que você vai tentar usar isso em cenários nos quais eu não previ. Qualquer dúvida, ou algo a acrescentar, favor colocar nos comentários!

 

***

Artigo original disponível em: http://www.instanceofanobject.com/2012/03/advanced-generic-handler-ashx.html

 

http://imasters.com.br/artigo/24198/dotnet/tecnicas-avancadas-para-usar-o-generics-handler-ashx

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.