Robson Alves O que torna um sonho irrealizável é a inércia de quem sonha

11set/111

PageRequestManager

Utilizando WebForms, tenho sempre em mente a vontade de melhor o desempenho das páginas e evitar ao máximo as requisições Server-Side. Como vejo muito acontecer, muitas vezes preciso alterar uma mascará de um campo e para isso é feito um postback em toda o Form, apenas com o único objetivo de alterar o campo em questão.

Isto é funcional, mas temos melhores formas de se fazer isto sem a utilização server-side, e só podemos falar em Jquery!

O Nosso cenário

Para que esta funcionalidade tenha efeito nós devemos utilizar nas páginas o updatepanel do AJAX.

Um botão do asp.net, com a função Click.

um script de jquery que altere informações dos campos da tela e meche com qualquer outro objeto.

2set/110

Reflection e os Atributos Customizados

 

Para começarmos a falar de Reflection é imprescindivel entender melhor o conceito da “coisa”.

A Reflexão permite que você conheça um objeto pelo seu tipo (Type) e dentro do seu tipo ter acesso a praticamente tudo o que o objeto te fornece. A Reflexão é resolvida toda em tempo de execução e daí que surgem classes ou métodos do tipo genérico. Desta forma temos a possibilidade de além de acessar, os seus métodos, acessar os encapsulamentos e até mesmo enviar novos valores para o objeto em tempo de execução.

Isto soa como sem novidade alguma, afinal fazemos isso todo o tempo, mas sempre devemos respeitar o TypeSafe do C#. Em métodos genéricos, nós estamos caminhando em um nível onde, todos são aceitos independente do seu Tipo.

Para entendermos um pouco melhor essa brevissima teoria, nada melhor do que a prática.

Lembre-se de instanciar a namespace:

using System.Reflection;
        static void Main(string[] args)
        {
            //Vamos capturar o tipo da classe Math
            Type Tipo = typeof(Math);

            //Vamos capturar os Valores de PI e E, que são variaveis const da classe Math.

            FieldInfo[] field = Tipo.GetFields();

            foreach (FieldInfo Campo in field)
            {
                Console.WriteLine(Campo.Name + "=" + Campo.GetValue(typeof(Math)).ToString());
            }

            Console.ReadKey();

        }

O Foreach resultou hein:

2set/110

Atributos Customizados

 

Este assunto é pouco falado, até mesmo sua utilização se torna um pouco restrita. Tive algumas idéias para a utilização deste e portanto gerou um artigo.

Mas o que são esses atributos?

Atributos da Classe

Estes atributos você encontra sobre a declaração de uma classe. Por Exemplo:

[Obsolete]
internal class Atributos
{
}

Obsolete é um atributo da classe que defini que a mesma é ultrapassada. Quando estamos criando um serviço em WCF no framework 3/3.5, nós somos obrigados a declarar os atributos, como no exemplo a seguir:

28mai/110

WCF – Estrutura de um Serviço

No capitulo anterior de WCF, nós aprendemos  um pouco sobre o que é WCF, O que são serviços do WCF e os tipos de comunicação entre serviços e clientes, existente.

Vamos dar continuidade agora para entender melhor como funciona os contratos de um serviço, seus membros.

Contratos

Basicamente um contrato de um WCF equivale as possibilidade que um serviço poderá realizar, a partir do contrato do serviço sabemos o que poderemos consumir do serviço e como conversar com o serviço.
Um Contrato que é uma interface tem como nomenclatura utilizar a vogal I na frente do nome ficando: IContractService.
a Sintaxe de um contrato é a seguinte:

  [ServiceContract]
    public interface IContractService
    {

        [OperationContract]
        string GetData(int value);

        [OperationContract]
        CompositeType GetDataUsingDataContract(CompositeType composite);

    }

O ServiceContract informa para o CLR que este são os dados de acesso ao serviço. O Operation Contract é quem divulga quais operações serão utilizadas.

CompositeType nada mais que uma class gerada automaticamente pelo wizard do VS, quando selecionamos o template WCF Services.

    [DataContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }

Aqui temos o [DataContract] que explicita para o serviço quais são os Dados do Contrato, utilizado pelo ServiceContract, e abaixo os [DataMembers] membros do DataContract. Os tipos ServiceContract, DataContract, DataMember, OperationContract, aceitam alguns parâmetros dentro das suas assinaturas, permitindo definir apelidos e até mesmo NameSpaces evitando possíveis conflitos de nomes. Vai um exemplo:

WCF_PARAMS

Por enquanto é isso, começamos a entender como um serviço do WCF é declarado e estruturado. A partir de agora vamos falar da sua hospedagem e posteriormente como consumiremos estes serviços!

Obrigado.

Categorias: Geral, WCF Sem Comentários
27mai/112

Jquery e C#–WebMethods

aspnet-jquery-ajax-150x150

Uma funcionalidade bem legal do Jquery em conjunto com o C#, estão nas possibilidade de chamadas assincronas, melhor ainda quando podemos acessar código C#.

Primeiramente vamos montar o script Jquery, ele pode estar dentro de um arquivo JS na solution ou na página.

O código está comentado, entretanto estamos utiizando o Ajax do Jquery capturando dados via Post e retornando Json. Veja:

Pra não sobrar dúvidas abaixo segue a sintaxe para informar parâmetros caso seu metódo Server-Side os possua.

data: "{Nome:'Robson'}",  //Apenas um parâmetro
data: "{Nome:'Robson', Sobre: 'Alves'}", //dois parâmetros

Atente-se:

  1. Os parâmetros são case-sensitive
  2. Caso tenha acrescido um parâmetro de entrada e gerar exceções, faça um re-build da solution e nos piores casos feche o IIS server do Visual Studio.
  3. A frente fica o nome do parâmetro, seguido do valor.

Os Objetos utilizados neste exemplo:

    
    

Agora temos nossa página pronta para capturar as informações e o alvo onde será renderizada a informação, partimos para o lado do servidor agora.

  [WebMethod]
        public static List Exemplos(string Nome, string Sobre)
        {
            List list = new List();
            Objetos obj = new Objetos();

            for (int i = 0; i < 10; i++)
            {
                obj = new Objetos();
                obj.Valorbool = i % 2 == 0 ? true : false;
                obj.ValorNum = i;
                obj.Valortxt = "RobsonAlves - " + Nome + " <-> " + Sobre;
                list.Add(obj);
            }

            return list;
        }

Veja na primeira linha, o WebMethod é quem permite que este método seja exposto Client-side, possibilitando o acesso pelo Jquery. Este exemplo gera uma lista, nada me impedi de pegar as informações do Banco. Detalhes deste:

  1. Os métodos sempre devem ser públicos
  2. A Assinatura é [WebMethod] no singular, [WebMethods] no Plural não serve.

Note que estamos retornando uma lista de Objetos que é uma classe POCO:

    public class Objetos
    {

        public int ValorNum { get; set; }
        public string Valortxt { get; set; }
        public Boolean Valorbool { get; set; }
    }

após estes passos, você terá as informações da lista na sua tela.

espero que este artigo seja útil.

Obrigado.

Categorias: Geral 2 Comentários
26mai/110

WCF–Primeiros Passos

WCF Services_2

O que é WCF?

O WCF é um SDK para desenvolvimento e distribuição de serviços no windows. WCF fornece um RUNTIME permintindo expor serviços do tipo CLR (Commom language Runtime) e consumi-los. WCF implementa um conjunto de padrões que definem a interação entre serviços, tipos de dados e protocolos de comunicação. Ele possue uma estrutura exigida por quase todos os aplicativos, possibilitando alta produtividade. A instância de serviços, chamadas assincronas, chamadas desconectadas em fila, seguança e interoperalibidade, são algumas das possibilidades possiveis. Neste cápitulo focarei nas formas de transação existentes e iremos evoluindo conforme possível.

O que é um Serviço WCF?

Parte do WCF que está exposto ao mundo. Este serviços podem ser Remotos ou Locais. A estrutura de um serviço consiste de uma inteface do contrato. A classe do contrato possuí assinaturas dos métodos, entretanto vou extender este assunto breve.

Já que sabemos que o serviço pode ser Remoto (Internet, Intranet), Local (Localhost, 127.0.0.1), vamos entrar citar cada tipo de comunicaçao exitente.

Tipo de Comunicação

Endereços TCP

Este é o primeiro dos tipos, o TCP, como cada comunicaçao tem um padrão para o TCP é o seguinte:

Ex: Tipo de comunicação://Endereço:Porta/Servico
net.tcp://localhost:7888/MeuServico
Caso a porta não seja informada seu padrão é: 808.
Este protocolo permite que dois serviços atenda a mesma porta, mas falaremos em outra ocasião.

Endereços HTTP

http://localhost:7888
Caso a porta não seja informada, o padrão é a porta: 80

Endereços IPC

Este protocolo utiliza o mecanismo de Pipes nomeados do windows, este tipo de comunicação apenas aceita chamadas do próprio computador, portanto é necessário informar o nome da máquina ou localhost. Este só será aberto uma única vez por máquina, não tendo possibilidade de compartilhar a mesma porta para este mesmo tipo de comunicação e nenhuma outra.
net.pipe://LocalHost/Canalizacao

Endereços MSMQ (Microsoft Message Queue)

Utilizado quando necessitar de fila de mensagens, você deve informar o nome da fila.
Caso seja necessário utilizar filas privadas, isto deve estar explicito no endereço: net.msmq://localhost/private/MinhaFila
Para as públicas, simplesmente omita seu tipo:
net.msmq://LocalHost/MinhaFila

É isso por enquanto, Obrigado.

23mai/110

Ferramentas para produtividade

 

 

canivete

Nos ultimos meses busquei em ferramentas uma forma de apurar minha produtividade e melhora-la.

Este assunto é muito pessoal, mas pode ser que estas dicas ajudem alguns que estejam atrás do mesmo resultado.

Para anotar as tasks categorizada por projetos, eu utilizo o evernote, cada nova nota faz referência a um projeto que estou engajado e utilizo caixas de seleção para cada tarefa que necessito realizar e até mesmo visualizar as tarefas já realizadas. Alguns lembretes e imagens podem ser armazenadas aqui desde que eu tenha que tomar alguma decisão sobre, entretanto este fazem partes de novas notas separadas.

O evernote atualmente possuí um aplicativo para android que supri todas as necessidades acima.

http://www.evernote.com/


Dropbox atualmente serve como um compartilhador de arquivos, em alguma empresas sofri restrições quanto a utilização do google docs, então gosto de compartilhar alguns documentos prioritários.

Este támbem possuí um aplicativo para o android que supera espectativas, muito prático.

http://www.dropbox.com/


Grindstone, esta ferramentsa fica local e ela basicamente controla todo o tempo gasto em cada tarefa, também separando por projetos, este software possibilita a geração de relatórios contabilizando o tempo de trabalho e até mesmo o tempo ocioso. Ele permite acompanhar o tempo por um relógio a parte que serve como contador para cada atividade que você esteja no momento. Ele captura sua ausência do computador pela ociosidade do mouse e pergunta se o tempo ocioso é para ser somado a atividade vigente ou descartar,para mim, o melhor software desta categoria.

Este programa é utilizado para gestão pessoal, entretanto existe versões pagas que possibilitam a gestão de um time inteiro.

http://www.epiforge.com/Grindstone/


Uma outra ferramenta que pra mim tem um foco um pouco diferente, mas pode ser enquadrado aqui.

XMind, esta ferramenta colabora com a geração de mapas mentais, facilitando na organização do pensamento e na construção de idéias,

ideal para inicio de projetos ou no planejamento da carreira, reformas de casa em fim, tudo que dependa de uma grande massa de informação.

Existe uma versão similar para o Android chamado: Mind Map Memo, recomendo a todos.

 

São estas ferramentas que venho utilizando e após longos meses a procura, hoje me sinto bem com estas, claro que com novas necessidades surgem novos procuras.

 

Obrigado.

23abr/110

Extesion Methods

Esse assunto é bem legal e simples, como verão abaixo. Uma classe de extensão, permite que gere novos métodos para as váriaveis do projeto como acontece em .ToString(), .ToUpper(). Pemitindo costumizar o codigo ao seu gosto, centralizando seus métodos em uma classe externa.

No exemplo abaixo vou fazer um método de extensão chamado CamelCase, que retornorá todo o texto incluso dentro das normas do CamelCase, para aqueles que não sabem:

images

CamelCase é a denominação em inglês para a prática de escrever palavras compostas ou frases, onde cada palavra é iniciada com Maiúsculas e unidas sem espaços. É um padrão largamente utilizado em diversas linguagens de programação, como Java, Ruby, PHP e Python, principalmente nas definições de Classes e Objetos. Pela sua associação com tecnologia, o marketing se apropriou dessa maneira de escrever, injetando certo ar de "tecnologia" nos produtos assim nomeados: iPod, GameCube, OpenOffice.org, StarCraft, dentre outros. (Fonte)

Vamos ao exemplo

 public static class ExtensionMethods
    {
        public static String CamelCase(this String source)
        {
            string[] arr = source.Split(new char[] { ' ', ',', '.', '_', '-' });
            String Retorno = string.Empty;

            foreach (String item in arr)
            {
                Retorno += item.Substring(0, 1).ToUpper() + item.Substring(1, item.Length - 1).ToLower();
            }

            return Retorno;
        }

    }

Repare que o método pode estar em qualquer classe do tipo static , o compilador ao entepretar o This na entrada dos parâmetros, reconhecerá em seguida este método como de extensão, independentemente do nome da sua classe ou namespace. Para sanar esta possivel dúvida eu gerei uma classe dento do namespace da página Default.aspx.cs, e ambos foram reconhecidos como extensão.

    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                String Case = "toDo Mundo sabE quE o camEl case-tem a primeira_letra de cada nova palavra como_maíuscula e sem espaço";
                int Numero = 12031202;
                Response.Write(Case.CamelCase());
                Response.Write(Numero.ParOuImpar());
            }
        }
    }

    public static class RobsonAlves
    {
        public static String ParOuImpar(this int Numero)
        {
            if (Numero % 2 == 0)
                return "PAR";
            else
                return "IMPAR";
        }
    }

è isso ai, os métodos de extensão são bem legais e simples, vale agora ter a necessidade de usar mais esta.

Obrigado.

21abr/112

Encontre no Texto com Expressões Regulares

Vou mostrar aqui 4 exemplos simples que captura texto, grupo de texto e faz replace dentro de um trecho via Expressão Regular

As ER's transferem um poder gigantesco quando necessitamos desta tarefas e até mesmo na geração de mascarás para textbox.

 

O REGEX possui algumas opções e é muito importante entender a funcionalidade de cada um para utilizar o ER da melhor forma:

http://msdn.microsoft.com/en-us/library/yd1hzczs(v=VS.100).aspx

RegexOptions,png

 

Vamos a prática.


Buscando Texto
 String Fonte = "aonde Quer Vá, Aonde Quer Que Seja, Ande com as pés";
 private void buscaTexto()
        {

            // Instância do Regex e a palavra que vamos buscar na fonte.
            Regex regex = new Regex("Aonde");

            // Armazena a coleção de Expressões Casadas.
            MatchCollection coll = regex.Matches(Fonte);

            foreach (Match item in coll)
            {
                lblResults.Text += String.Format(" Encontrei a palavra {0} na posição {1} e Termina na Posição {2}",
					item.Value.Trim(), item.Index, item.Index + item.Value.Length);
            }
        }

Quantidade de Letras por palavras

String Fonte = "aonde Quer Vá, Aonde Quer Que Seja, Ande com as pés";
 private void buscaTextoQtdLetras()
        {
            //Busca por palavras que contenha apenas Letras Maiuscula e Minuscula
            // e tenham 3 ou mais caracteres.
            Regex regex = new Regex("[a-zA-Z]{5,}");
            // Armazena a coleção de Expressões Casadas.
            MatchCollection coll = regex.Matches(Fonte);

            foreach (Match item in coll)
            {
                lblResults.Text += String.Format(" Encontrei a palavra {0} na posição {1} e Termina na Posição {2} Que Possui {3} ou Mais", item.Value.Trim(), item.Index, item.Index + item.Value.Length, item.Value.Length);
            }
        }

Extraindo Grupo do Text

 private void ExtraindoPorGrupos()
        {
            String End = "1234 Cherry Lane, USA" + Environment.NewLine + "1234 Apple Tree Drive, Smalltown, USA " + Environment.NewLine + "3456 Chry Orchard streetm Smalltown, USA";

            //Busca da esquerda pra direita após os numeros o nome da rua, pegando os espaços \\s entre as letras e pegando todas,
            //ignorando a virgula e tudo que vem após a mesma.
            Regex regex = new Regex("^(?\\d+)\\s*(?[\\w\\s]*)", RegexOptions.Multiline);

            MatchCollection coll = regex.Matches(End);

            foreach (Match item in coll)
            {
                string Rua = item.Groups["Rua"].Value;
                String Numero = item.Groups["Numero"].Value;
                lblResults.Text += ""+ String.Format("Rua : {0} ", Rua);
                lblResults.Text += "" + String.Format("Número :{0} ", Numero);
            }
        }

Replace Com Regex

private void ReplaceTexto()
        {
            Regex regex = new Regex("^[aA]\\w+");

            lblResults.Text += "" + regex.Replace(Fonte, "Por Onde");
        }

Após rodar a aplicação o seguinte resultado é gerado:

OutPut

Muito legal, acredito que isto ajudará a ter noção do que da pra ser feito com Regex e Expressões Regulares, compensa sim dar uma estuda na sintaxe ER para .Net.

Obrigado.

20abr/110

Session State

Vou falar um pouco dos tipos de status existentes nas sessions geradas na aplicação

Por Que Se Preocupar?

Os tipos de session possuim certas limitações que devem ser consideradas, após analisar o nível de acesso que o sistema terá ao longo do tempo, o tipo de hospedagem que este terá (Caso seja por terceiros), trâfego absoluto que o site tem.
Tudo isto deve ser levado em consideração na hora de utilizar Session em um sistema, a seguir ficará  mais claro os porquês desta preocupação.

Quais são os tipos ?

Os tipos são:
Inproc: Considerado o mais rápido dos tipos existente, por manter objetos em memória junto com o processo do ASP.Net.

StateServer: Aqui toda a sessão é serializada, assim tendo uma perca de performace quando comparado ao InProc, entretanto existe a possibilidade de enviar esta sessão para outro servidor tornar-se resposável pelo armazenamento destas informações, podendo assim ser uma boa escolha. Largamente recomendado quando existe um grande fluxo de usuário no site.
Para utilizar este serviço, procure nos serviços do Windows o processo chamado: ASP.NET State Services, para tal digite no executar, services.msc.
explor10Para
descobrir a porta do servidor qual será configurado para armazenar é necessário encontrar nos registros o mesmo.

SQLServer: Sim, a session é armazenada em banco de dados, e possuí também certa desvatagem performática, quando comparado ao Inproc, entretanto esta forma permite que a sessão seja recuperada desde que dentro da “Validade” da sessão gerada.

Para informar o tempo que será válida a sessão, assim como qual servidor atendará no armazenamento das informações das sessões ou qual o servidor e instâncias que será utilizado. explor5

Web-Config

Para cada tipo respectivamente, segue como deve ser declarado no Web.Config.
Inproc:


<system.web>
    <sessionState 

  mode="InProc" 

  timeout="1" 

  cookieless="false"> 

</sessionState> 

</system.web> 

StateServer:


<sessionState
    mode="StateServer" 

  cookieless="false" 

  stateNetworkTimeout="20" 

  stateConnectionString="127.0.0.1:42424"> 

</sessionState> 


SqlServer


<sessionState
    mode="StateServer" 

  timeout="20" 

  cookieless="false" 

  sqlConnectionString="Data Source=127.0.0.1;Trusted_Connection=Yes;"> 

</sessionState> 


Usando o Cookieless igual a "False", quer dizer que será gerado junto com a sessão Cookies.

Eu iria listar vantagem e desvantagens de cada um, mas isso tornaria uma análise extremamente pessoal, e como foi citado inicialmente isso deve ser utilizado após a análise das necessidades do sistema.

Para buscarem mais detalhes sobre este assunto:

http://www.codeproject.com/KB/aspnet/ExploringSession.aspx

Obrigado.