Desenvolvedores.Net - TechBlog

Category Archives: Desenvolvimento

Gerando hexadecimal aleatório em CSharp

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (6 votos, média: 4,20 de 5)
Loading...
13 de julho de 2012

Olá Pessoal.

Recentemente tive a necessidade de gera um número hexa randômico no C#.
Desenvolvi este código simples, que compartilho com vocês.

using System;
using System.Linq;

namespace RandomHEXNumber
{

    /// <summary>
    /// extensões para tipos randômicos
    /// </summary>
    public static class RandomExtensions
    {
        /// <summary>
        /// gera um número hexadecimal com tamanho de 4 dígitos
        /// </summary>
        /// <param name="random">instância do tipo Random</param>
        /// <returns>número hexa randomico</returns>
        public static string NextHex(this Random random)
        {
            return NextHex(random, 4);
        }

        /// <summary>
        /// gera um número hexadecimal com tamanho definido em digits
        /// </summary>
        /// <param name="random">instância do tipo Random</param>
        /// <param name="digits">quantidade de dígitos que o random deverá retornar</param>
        /// <returns>número hexa randomico</returns>
        public static string NextHex(this Random random, int digits)
        {
            //se estiver em um for, o random usa o milisegundos para gerar o número
            //logo pode causar numeros repetidos. Sendo assim vamos esperar 10 milisegundos
            System.Threading.Thread.Sleep(10);

            //array de bytes do random
            byte[] buffer = new byte[digits / 2];

            //gerar o random
            random.NextBytes(buffer);

            //concatenar o buffer
            string result = String.Concat(buffer.Select(x => x.ToString("X2")).ToArray());
            if (digits % 2 == 0)
                return result;

            //adiciona mais um dígito.
            result += random.Next(16).ToString("X");
            return result;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Gerando número hexa com tamanho padrão");
            Console.WriteLine(new Random().NextHex());
            Console.WriteLine("");

            Console.WriteLine("Gerando número hexa com tamanho definido");
            Console.WriteLine(new Random().NextHex(7));
            Console.WriteLine("");

            Console.WriteLine("Gerando número hexa em um laço");
            for (int i = 1; i < 10; i++)
            {
                Console.WriteLine(new Random().NextHex(i));
            }

            Console.ReadKey();
        }
    }
}

É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Xuxa para Programadores

10
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (10 votos, média: 4,00 de 5)
Loading...
3 de março de 2012

Olá Pessoas.

Ultimamente estou sem idéias para escrever então resolvi desenvolver a minha lógica precária com uma música da Xuxa, Cinco Patinhos.

Segue 🙂

using System;

namespace XuxaParaProgramadores
{
    class Patinhos
    {
        static void Main(string[] args)
        {
            Console.Title = string.Format("Xuxa - 5 Patinhos");

            for (int i = 5; i >= 1; i--)
            {
                Console.WriteLine("{0} {1} passear", i, i == 1 ? "patinho foi" : "patinhos foram");
                Console.WriteLine("além das montanhas para brincar");

                WriteQuack();

                Console.WriteLine("Mas {0} de lá.", GetPatinhos(i - 1));
                Console.WriteLine();
            }

            Console.WriteLine("A mamãe patinha foi procurar");
            Console.WriteLine("Além das montanhas");
            Console.WriteLine("Na beira do mar");
            WriteQuack();
            Console.WriteLine("E os 5 patinhos voltaram de lá");

            Console.ReadKey();
        }

        /// <summary>
        /// retorna o texto do número de patinhos que voltaram
        /// </summary>
        /// <param name="numPatinhos">número de patinhos que voltaram</param>
        /// <returns></returns>
        private static string GetPatinhos(int numPatinhos)
        {
            if (numPatinhos > 0)
                return (numPatinhos == 1 ? "só " + numPatinhos + " patinho voltou" : "só " + numPatinhos + " patinhos voltaram");

            return "nenhum patinho voltou";
        }

        /// <summary>
        /// Escreve os quacks dos patinhos
        /// </summary>
        private static void WriteQuack()
        {
            Console.WriteLine("A mamãe gritou ");
            for (int x = 0; x < 4; x++)
                Console.WriteLine("quá!");
        }
    }
}

A saída do código:


É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Ai se eu te pego

2
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (4 votos, média: 5,00 de 5)
Loading...
14 de janeiro de 2012


private void MichelTelo()
{
    for (int i = 0; i < 3; i++)
            {
                Delicia delicia = new Delicia();

                delicia.AssimVoceMeMata();

                if (delicia.AiSeEuTePego())
                {
                    // TODO: Não faz nada
                }

                if (delicia.AiAiSeEuTePego())
                {
                    // TODO: Também Não faz nada
                }

                Balada balada = new Balada("Sabado");

                Galera galera = new Galera();

                galera.ComecarADancar(balada);

                MeninaMaisLinda meninaMaisLinda = balada.ObterMeninaMaisLinda();

                if (ObterCoragem())
                {
                    ComecarAFalar(); // Sozinho???
                }
            }
}

É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Recuperando métodos e propriedades (C#)

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (3 votos, média: 5,00 de 5)
Loading...
18 de novembro de 2011

 A dúvida.

Como recuperar os nomes de métodos e propriedades de um objeto em C#?

Simples. Usando System.Reflection.

Para conhecer mais o namespace http://msdn.microsoft.com/pt-br/library/system.reflection.aspx.

Exemplo para recuperar métodos e propriedades.

Crie uma nova aplicação console e utilize o código abaixo.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ConsoleApplication
{
    class MinhaClasse
    {
        #region Propriedades
        public string Nome { get; set; }
        public string Sobrenome { get; set; }
        #endregion

        #region Fields
        public int Idade;
        public int Ano;
        #endregion

        #region Métodos
        public void Salvar()
        {
            Console.WriteLine("Nome      : {0}\nSobrenome : {1}\nRegistro salvo", Nome, Sobrenome);
        }

        public int Somar(int v1, int v2)
        {
            return v1 + v2;
        }
        #endregion

        #region Privados
        private void Privado()
        {
            Console.WriteLine("Eu sou um método privado");
        }
        #endregion
    }

    class Program
    {
        static void Main(string[] args)
        {
            #region Criando objeto
            MinhaClasse mc = new MinhaClasse();
            mc.Nome = "Desenvolvedores";
            mc.Sobrenome = "Net";
            mc.Idade = 8;
            mc.Ano = 2004;
            #endregion

            #region Recuperando as propriedades
            Console.WriteLine("Recuperando a propriedade nome");
            //recuperando as propriedades quando se sabe o nome
            PropertyInfo pi = mc.GetType().GetProperty("Nome");
            Console.WriteLine(pi.GetValue(mc, null).ToString());

            Console.WriteLine("");
            Console.WriteLine("Percorrendo as propriedades");
            //percorrendo as propriedades
            PropertyInfo[] pis = mc.GetType().GetProperties();

            foreach (PropertyInfo p in pis)
            {
                Console.WriteLine("Propriedade:{0} - Valor: {1}", p.Name, p.GetValue(mc, null));
            }
            #endregion

            #region Recuperando os campos
            Console.WriteLine("");
            Console.WriteLine("Recuperando o campo Idade");
            //recuperando o canmpo quando se sabe o nome
            FieldInfo fi = mc.GetType().GetField("Idade");
            Console.WriteLine(fi.GetValue(mc).ToString());

            Console.WriteLine("");
            Console.WriteLine("Percorrendo os campos");
            //percorrendo as propriedades
            FieldInfo[] fis = mc.GetType().GetFields();

            foreach (FieldInfo p in fis)
            {
                Console.WriteLine("Campo:{0} - Valor: {1}", p.Name, p.GetValue(mc));
            }
            #endregion

            #region Recuperando métodos
            Console.WriteLine("");
            Console.WriteLine("Recuperando o método salvar");
            //quando se sabe o nome
            MethodInfo mi = mc.GetType().GetMethod("Salvar");

            Console.WriteLine("");
            Console.WriteLine("Executando método salvar");
            mi.Invoke(mc, null);

            Console.WriteLine("");
            Console.WriteLine("Percorrendo métodos");

            //nao sei os nomes
            MethodInfo[] mis = mc.GetType().GetMethods();

            foreach (MethodInfo m in mis)
            {
                Console.WriteLine("Método:{0} - Parâmetros: {1} - Retorno: {2}", m.Name, m.GetParameters().Count(), m.ReturnType);
            }

            //executando métodos com parâmetros
            Console.WriteLine("");
            Console.WriteLine("Executando métodos com parâmetros e recebendo um retorno");

            mi = mc.GetType().GetMethod("Somar");
            Console.WriteLine("Resultado do método somar: {0}", mi.Invoke(mc, new object[] { 26, 29 }));

            Console.WriteLine("");
            Console.WriteLine("Recuperando um método privado e executando");

            mi = mc.GetType().GetMethod("Privado", BindingFlags.Instance |
                                                       BindingFlags.NonPublic);
            mi.Invoke(mc, null);

            #endregion
            Console.ReadKey();
        }
    }
}

É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Embedded Javascript

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (2 votos, média: 5,00 de 5)
Loading...
5 de novembro de 2011

embedded-javascript

Introdução

Neste artigo irei ensinar uma técnica em asp.net para embutir javascript em uma página HTML como um recurso embutido (embedded resource), utilizando nossos próprios componentes.

Muitas vezes precisamos escrever nossos controles em asp, e quando vamos disponibilizar nossa biblioteca de controles nos deparamos com a necessidade de enviar todo o código que foi feito em javascript e nossos controles compilados  não são instalados corretamente, algum diretório da nossa estrutura é modificado pelo usuário, algum diretório não é criado, logo, nossos controles deixam de funcionar como gostaríamos por causa de uma instalação errada ou uma permissão de arquivo.

Um recurso interessante que vejo nos controles asp é a possibilidade de embutirmos todo o nosso código javascript dentro da DLL do controle, isso mesmo, compilar e embutir o nosso javascript e depois utilizar ele com um recurso não mais precisando fazer a criação de diretórios, ou distribuir nossos arquivos .js junto com nosso controle.

O que é Recurso Embutido (Embedded Resource)?

Recurso embutido é quando inserimos algum arquivo dentro de nossa aplicação e o mesmo é compilado e enviado junto com a aplicação dentro do mesmo arquivo, seja um .exe ou .DLL.

Exemplos práticos de arquivos embutidos são quando criamos aplicações Windows no Visual Studio, se repararmos quando colocamos uma imagem em um “form” é criado um arquivo com a extensão .resx, este arquivo é usado para embutir o recurso, no caso uma imagem.

Outro arquivo que o Visual Studio cria é o “Resources.resx” este arquivo é criado quando inserimos imagens, textos, áudio, qualquer arquivo que iremos usar como um recurso em nossa aplicação.

Em asp isso também é possível, neste arquivo irei ensinar como fazer com javascript, mas isso não quer dizer que é possível apenas com javascript, pode ser utilizado para css, imagens e até mesmo páginas inteiras. Mas o nosso foco é javascript.

O que veremos?

Iremos ver desde o modo mais simples de embutir um recurso:

Até o tratamento com o nosso próprio handler.

Iremos ver aqui também como registrar este recurso dentro da tag HEAD e não na tag BODY

Ok! Chega de lero-lero e vamos ao que interessa, se você chegou até aqui é porque já está habituado com o visual Studio. Vou assumir que você tem conhecimento em desenvolvimento web.

Iniciando

Para o nosso exemplo iremos criar dois projetos, uma aplicação web e uma aplicação de controle.

Passos:

  1. Abra o Visual Studio  e crie uma nova aplicação web (ASP.Net Web Application), a minha eu chamei de EmbeddingJavascript;
  2. Adicione um segundo novo projeto à sua solução, do tipo “ASP.Net Server Control” o meu eu chamei de EmbeddingJavascriptMyControl.
  3. No projeto “EmbeddingJavascriptMyControl” adicione um novo item do tipo “ASP.Net Server Control” e de o nome de “MyControl”

Agora já temos dois projetos em nossa solução veja se a sua está parecida com a minha:

Agora vamos à montagem dos códigos e configurações necessárias para fazer o nosso script embutido.

Abra sua classe “MyControl.cs” no método RenderContents iremos criar o nosso componente, um componente simples que irá pedir um texto qualquer com um botão para ser clicado.

Veja o código

protected override void RenderContents(HtmlTextWriter output)
{
string html = @"Digite algo:
				<input type='text' id='txtAlgo' />
				<input type='button' value='Clique aqui' onclick='CallAlert(txtAlgo.value);' />";

output.Write(html);
}

Reparem na linha cinco do código que temos um onclick=’CallAlert(txtNome.value);’ para não dar erro em nossa aplicação temos que definir o script e criar a função js CallAlert.

Então mãos a obra.

No projeto “EmbeddingJavascriptMyControl”  Adicione um novo item do tipo “JScript File” o meu eu chamei de “MyControl.js” nele iremos digitar o nosso código para a função CallAlert

/**
* Exibe uma mensagem de alerta
* @param m (string) mensagem a ser exibida
*/
function CallAlert(m)
{
    if(m=='')
        alert("Informe a mensagem a ser exibida");
    else
        alert(m);
} 

Feito isso voltaremos ao nosso projeto “EmbeddingJavascript”, siga os passos descritos para colocar o nosso componente na página Default.aspx

  1. Faça a referencia ao projeto “EmbeddingJavascriptMyControl”;
  2. Feito a referencia abra o arquivo Default.aspx, nele iremos colocar uma diretiva para que possamos ter o nosso controle na página.
<%@ Register Assembly="EmbeddingJavascriptMyControl" Namespace="EmbeddingJavascriptMyControl"
    TagPrefix="myctl" %>

Repare na propriedade TagPrefix, é por ela que iremos acessar os nossos controles criados no namespace que foi carregado pela propriedade Namespace, é uma atalho, para não ter que ficar digitando todo o namespace.
Dentro da tag body iremos declarar agora nosso controle MyControl, para isso temos que usar a tag “myctl”, veja a declaração:

<myctl:MyControl runat="server" ID="myControl" />

Código completo da página Default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="EmbeddingJavascript._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Register Assembly="EmbeddingJavascriptMyControl" Namespace="EmbeddingJavascriptMyControl"
    TagPrefix="myctl" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Acessando recursos embutidos</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <myctl:MyControl runat="server" ID="myControl" />
    </div>
    </form>
</body>
</html>

Ok! Vamos agora executar nossa aplicação e clicar no botão que será criado no navegador.

🙁 Puxa. Primeiro erro, “CallAlert não está definido”.

Obvio, ainda não o definimos. Vamos fazer algumas configurações para que o nosso arquivo javascript seja carregado de forma correta.

Voltaremos ao nosso projeto “EmbeddingJavascriptMyControl” selecione o arquivo “MyControl.js” botão direito, “Propriedades” ou “Properties” na janela que abriu, em “Build Action” marque “Embedded Resource

Agora vamos executar nossa aplicação e clicar no botão novamente… e … erro de novo, o mesmo erro  “CallAlert não está definido”. Isso acontece porque não basta marcar como “Embedded Resource”, ainda temos mais duas alterações a fazer para que nosso recurso funcione. Então vamos a elas.

Primeira Alteração

Abra o arquivo AssemblyInfo.cs e nele digite a seguinte linha

 [assembly: System.Web.UI.WebResource("EmbeddingJavascriptMyControl.MyControl.js", "application/x-javascript")]

Esta linha dirá ao Assembly onde está o recurso embutido, mas muita atenção aqui a dois pontos:

  • É case sensitive (Sensível ao Caso), diferencia MAIÚSCULAS de minúsculas;
  • Onde informamos “EmbeddingJavascriptMyControl.MyControl.js” temos que prestar atenção a nossa estrutura de diretório, se nossos arquivos .js irão ficar em um diretório chamado “Resource/js/arquivo.js” temos que informar o caminho completo do arquivo, assim:  “EmbeddingJavascriptMyControl.Resource.js.arquivo.js”

O arquivo AssemblyInfo.js fica em embaixo do nó “Properties” do nosso projeto “EmbeddingJavascriptMyControl”

Segunda Alteração

Voltaremos ao nosso projeto “EmbeddingJavascript”, abra o arquivo “Default.aspx”.

Antes da nossa declaração <myctl:MyControl… cole a seguinte linha

 <asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="True" runat="server">
            <Scripts>
                <asp:ScriptReference Assembly="EmbeddingJavascriptMyControl" Name="EmbeddingJavascriptMyControl.MyControl.js" />
            </Scripts>
        </asp:ScriptManager>

O Código da página deve ter ficado parecido com este:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="EmbeddingJavascript._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Register Assembly="EmbeddingJavascriptMyControl" Namespace="EmbeddingJavascriptMyControl"
    TagPrefix="myctl" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Acessando recursos embutidos</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID="ScriptManager1" EnablePartialRendering="True" runat="server">
            <Scripts>
                <asp:ScriptReference Assembly="EmbeddingJavascriptMyControl" Name="EmbeddingJavascriptMyControl.MyControl.js" />
            </Scripts>
        </asp:ScriptManager>
        <myctl:MyControl runat="server" ID="myControl" />
    </div>
    </form>
</body>
</html>

Agora podemos executar nossa aplicação e clicar no botão que tudo irá funcionar.

Abra o código fonte da página, vamos ver o que foi gerado.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
	Acessando recursos embutidos
</title></head>
<body>
    <form name="form1" method="post" action="default.aspx" id="form1">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTEyNjU1NTIyMDlkZBHjFb7Tj9qnQw+tUeeM3n2rSAIt" />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

<script src="/WebResource.axd?d=vJiRxykuUPDnEnitlfulpUyNW8r5H6f6ZTXVc0STOzayuJB5KQYvdOM6qDn1woYY3aHrZvYEH3kaqgMXLvHN0f1Rgw81&amp;t=634245118914809245" type="text/javascript"></script>

<script src="/ScriptResource.axd?d=pQSfU-Gluj5fWKvwHugAhrYCplBo6HWtAZk18MYQFen7LCnH5eACZQlY2hQFj_mG8wBOBn8gzXjwh__AP4GvZAYiRAXNVfqsrwJ_47pioSwJ0Nt50nZsPwYb_ImjAVVyDYqnF5Mrxws1Hb-eiA7hx6mpB7JzD1kjO5Z0nisDG9Htu64q0&amp;t=fffffffff9d85fa6" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
if (typeof(Sys) === 'undefined') throw new Error('A estrutura do cliente do ASP.NET Ajax falhou ao ser carregada.');
//]]>
</script>

<script src="/ScriptResource.axd?d=NjPhQE1Bg_p8r6kqRbkzTPoHZEUVZljs8n4CqKl-4K_SKhwe4jodATh4CnF0I6areXjIfo1RXiLf4npDOWzM3aFzuXVJ8J5aUvDNXTQM0aIaoAgK-1desXxMafETtHLNsh1PEt5-FelvmW-JH-0-0vJV7Y2ziFETXay4wFRNjRdh_c1F0&amp;t=fffffffff9d85fa6" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=BZRoaxvjoo_kLM6d5_RbZyrPibF04d5B4H_E9ve7x6R9w7j4h8eSLh1dELDU0HnMVzRTtC11C31fvdqZm20-B7I3y0joB9f7DDGCZbLa5ydhKnkJqYlCPlFvCw83WLuQCOYPbAJ9hEEPRfOGyysCkjJ9Pal1xeF5TbJH3LC4OYpMqqSQ0&amp;t=ffffffffb915d82c" type="text/javascript"></script>
    <div>
        <script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ScriptManager1', document.getElementById('form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls([], [], [], 90);
//]]>
</script>

        <span id="myControl">Digite algo:
                            <input type='text' id='txtAlgo' />
                            <input type='button' value='Clique aqui' onclick='CallAlert(txtAlgo.value);' /></span>
    </div>

<script type="text/javascript">
//<![CDATA[
Sys.Application.initialize();
//]]>
</script>
</form>
</body>
</html>

Podemos reparar que desta forma funciona, mas, não creio que atenda a nossa necessidade, alem de que é gerada muita coisa desnecessária em nossa página, vamos fazer uma análise de tudo que aconteceu na nossa página.

Veja quantas linhas de código foram geradas apenas para mostrar uma mensagem de alerta.

<script src="/WebResource.axd?d=vJiRxykuUPDnEnitlfulpUyNW8r5H6f6ZTXVc0STOzayuJB5KQYvdOM6qDn1woYY3aHrZvYEH3kaqgMXLvHN0f1Rgw81&amp;t=634245118914809245" type="text/javascript"></script>

<script src="/ScriptResource.axd?d=pQSfU-Gluj5fWKvwHugAhrYCplBo6HWtAZk18MYQFen7LCnH5eACZQlY2hQFj_mG8wBOBn8gzXjwh__AP4GvZAYiRAXNVfqsrwJ_47pioSwJ0Nt50nZsPwYb_ImjAVVyDYqnF5Mrxws1Hb-eiA7hx6mpB7JzD1kjO5Z0nisDG9Htu64q0&amp;t=fffffffff9d85fa6" type="text/javascript"></script>
<script type="text/javascript">
//<![CDATA[
if (typeof(Sys) === 'undefined') throw new Error('A estrutura do cliente do ASP.NET Ajax falhou ao ser carregada.');
//]]>
</script>

<script src="/ScriptResource.axd?d=NjPhQE1Bg_p8r6kqRbkzTPoHZEUVZljs8n4CqKl-4K_SKhwe4jodATh4CnF0I6areXjIfo1RXiLf4npDOWzM3aFzuXVJ8J5aUvDNXTQM0aIaoAgK-1desXxMafETtHLNsh1PEt5-FelvmW-JH-0-0vJV7Y2ziFETXay4wFRNjRdh_c1F0&amp;t=fffffffff9d85fa6" type="text/javascript"></script>
<script src="/ScriptResource.axd?d=BZRoaxvjoo_kLM6d5_RbZyrPibF04d5B4H_E9ve7x6R9w7j4h8eSLh1dELDU0HnMVzRTtC11C31fvdqZm20-B7I3y0joB9f7DDGCZbLa5ydhKnkJqYlCPlFvCw83WLuQCOYPbAJ9hEEPRfOGyysCkjJ9Pal1xeF5TbJH3LC4OYpMqqSQ0&amp;t=ffffffffb915d82c" type="text/javascript"></script>
    <div>
        <script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ScriptManager1', document.getElementById('form1'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls([], [], [], 90);
//]]>
</script>

Imagine se tivéssemos muitos controles carregados na página, o tanto de código que seria carregado.
E se precisássemos chamar algum método antes da tag body para que nosso controle funcione perfeitamente?

Outro problema, é que o utilizador de nossos componentes teria que saber a estrutura de nossos recursos e teria que se lembrar de ficar colocando o Script Manager e configurá-lo de forma adequada em todas as páginas, caso contrário daria erros. Isso não é legal.

Mas como eu prometi, vamos resolver todos estes problemas com o uso de Handlers e Modules.

Então, vamos a segunda parte do artigo.


Usando Handlers e Modules com recursos embutidos

Antes de iniciar vamos descobrir para que servem e o que são os handlers e modules.

O que são handlers (manipuladores)?

Os handlers, ou manipuladores, normalmente processam as requisições e não têm interatividade com o usuário, como páginas ou controles, e normalmente são responsáveis por camadas lógicas dentro da aplicação.

Podemos utilizar um handler quando precisamos executar algo no servidor sem a necessidade de intervenção do usuário final.

Os handlers implementam a interface IHttpHandler, o HttpHandler é responsável por atender as requisições do browser e a interface IHttpHandler possui as assinaturas necessárias para que estas requisições sejam atendidas.

O que são modules (módulos)?

Os módulos HTTP são executados antes e depois do handler (manipulador) e nos fornece métodos para interagir com a requisição (HttpRequest). Os módulos devem implementar a interface System.Web.IHttpModule.

São normalmente sincronizados com os eventos da classe System.Web.IHttpModule (implementado dentro do Global.asax.cs ou. vb).

A seguir uma lista de eventos que devem ser considerados na implementação do módulo:

  • BeginRequest
  • AuthenticateRequest
  • AuthorizeRequest
  • ResolveRequestCache
  • AcquireRequestState
  • PreRequestHandlerExecute
  • PostRequestHandlerExecute
  • ReleaseRequestState
  • UpdateRequestCache
  • EndRequest
  • * PreSendRequestHeaders
  • * PreSendRequestContent
  • * error

Os eventos identificados por um asterisco (*) pode ocorrer a qualquer momento dentro da requisição, todos os outros estão listados em sua ordem de chamada.

Agora que sabemos com o que iremos trabalhar, vamos dar uma limpada na nossa página “Default.aspx” remova a tag do Script Manager, não iremos usar mais ela.  O código deverá ter ficado assim:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="EmbeddingJavascript._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<%@ Register Assembly="EmbeddingJavascriptMyControl" Namespace="EmbeddingJavascriptMyControl"
    TagPrefix="myctl" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Acessando recursos embutidos</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <myctl:MyControl runat="server" ID="myControl" />
    </div>
    </form>
</body>
</html>

Voltaremos ao nosso projeto “EmbeddingJavascriptMyControl” , adicionaremos uma nova classe ao nosso projeto, a minha eu chamei de “ResourceHandler.cs”

Segue o código completo da classe:

 #region Using
using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Text;
using System.Text.RegularExpressions;
using System.IO.Compression;
using System.Web.Caching;
using System.Net;
using System.Collections.Generic;
using System.Reflection;
#endregion

namespace EmbeddingJavascriptMyControl
{
    public class ResourceHandler : IHttpHandler
    {
        private const int DAYS_IN_CACHE = 30;
        public void ProcessRequest(HttpContext context)
        {
            string path = context.Request.QueryString["r"];
            path = "EmbeddingJavascriptMyControl." + path + ".js";
            string content = string.Empty;

            if (!string.IsNullOrEmpty(path))
            {
                if (context.Cache[path] == null)
                {
                    string[] scripts = path.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                    foreach (string script in scripts)
                    {
                        content += RetrieveScript(script) + Environment.NewLine;
                    }

                    content = StripWhitespace(content);
                    context.Cache.Insert(path, content, null, Cache.NoAbsoluteExpiration, new TimeSpan(DAYS_IN_CACHE, 0, 0, 0));
                }
            }

            content = (string)context.Cache[path];
            if (!string.IsNullOrEmpty(content))
            {
                context.Response.Write(content);
                SetHeaders(content.GetHashCode(), context);
                Compress(context);
            }
        }

        /// <summary>
        /// carrega o script em memória e depois devolve ao objeto chamador
        /// </summary>
        /// <param name="resourceFullName">caminho completo do recurso</param>
        private static string RetrieveScript(string resourceFullName)
        {
            string script = null;
            //get from resource
            Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceFullName);

            if (stream != null)
            {
                using (StreamReader sr = new StreamReader(stream))
                {
                    script = sr.ReadToEnd();
                    sr.Close();
                }
            }

            return script;
        }

        /// <summary>
        /// limpa o arquivo javascrip e retorna
        /// </summary>
        /// <param name="body">script</param>
        private static string StripWhitespace(string body)
        {

            /*
             * aqui eu retorno o o script diretamente
             * facilita para a depuração.
             * mas você pode tratar, se estiver em modo debug, não limpa
             * compilou, limpa
             */

            //remove newLine e comentários com //
            string[] lines = body.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
            StringBuilder emptyLines = new StringBuilder();
            foreach (string line in lines)
            {
                string s = line.Trim();
                if (s.Length > 0 && !s.StartsWith("//"))
                {
                    if (s.Contains("//"))
                        s = s.Substring(0, s.IndexOf("//"));

                    emptyLines.AppendLine(s.Trim());
                }
            }

            body = emptyLines.ToString();

            // remove C styles comments
            body = Regex.Replace(body, "/\\*.*?\\*/", String.Empty, RegexOptions.Compiled | RegexOptions.Singleline);
            //// trim left
            body = Regex.Replace(body, "^\\s*", String.Empty, RegexOptions.Compiled | RegexOptions.Multiline);
            //// trim right
            body = Regex.Replace(body, "\\s*[\\r\\n]", "\r\n", RegexOptions.Compiled | RegexOptions.ECMAScript);
            // remove whitespace beside of left curly braced
            body = Regex.Replace(body, "\\s*{\\s*", "{", RegexOptions.Compiled | RegexOptions.ECMAScript);
            // remove whitespace beside of coma
            body = Regex.Replace(body, "\\s*,\\s*", ",", RegexOptions.Compiled | RegexOptions.ECMAScript);
            // remove whitespace beside of semicolon
            body = Regex.Replace(body, "\\s*;\\s*", ";", RegexOptions.Compiled | RegexOptions.ECMAScript);
            // remove newline after keywords
            //body = Regex.Replace(body, "\\r\\n(?<=\\b(abstract|boolean|break|byte|case|catch|char|class|const|continue|default|delete|do|double|else|extends|false|final|finally|float|for|function|goto|if|implements|import|in|instanceof|int|interface|long|native|new|null|package|private|protected|public|return|short|static|super|switch|synchronized|this|throw|throws|transient|true|try|typeof|var|void|while|with)\\r\\n)", " ", RegexOptions.Compiled | RegexOptions.ECMAScript);

            return body;
        }

        /// <summary>
        /// Isso fará com que o navegador e o servidor mantenham a saída
        /// em cache melhorando o desempenho.
        /// </summary>
        private static void SetHeaders(int hash, HttpContext context)
        {
            HttpCachePolicy cache = context.Response.Cache;
            DateTime modifiedDate = new DateTime(GetAssemblyTime(Assembly.GetExecutingAssembly())).ToUniversalTime();
            DateTime nowDate = DateTime.Now.ToUniversalTime().AddSeconds(-1);

            if (modifiedDate > nowDate)
            {
                modifiedDate = nowDate;
            }

            cache.SetLastModified(modifiedDate);
            cache.SetOmitVaryStar(true);
            cache.SetVaryByCustom("r");
            cache.SetExpires(DateTime.UtcNow.AddDays(365));
            cache.SetValidUntilExpires(true);
            cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
            cache.SetCacheability(HttpCacheability.Public);
            cache.SetLastModifiedFromFileDependencies();
            cache.SetMaxAge(new TimeSpan(DAYS_IN_CACHE, 0, 0, 0));
            cache.SetETag("\"" + hash.ToString() + "\"");

            context.Response.ContentType = "text/javascript";
            context.Response.Cache.VaryByHeaders["Accept-Encoding"] = true;
        }

        private static long GetAssemblyTime(Assembly assembly)
        {
            AssemblyName assemblyName = assembly.GetName();

            return File.GetLastWriteTime(new Uri(assemblyName.CodeBase).LocalPath).Ticks;
        }

        #region Compression

        private const string GZIP = "gzip";
        private const string DEFLATE = "deflate";

        private static void Compress(HttpContext context)
        {
            if (context.Request.UserAgent != null && context.Request.UserAgent.Contains("MSIE 6"))
                return;

            if (IsEncodingAccepted(GZIP))
            {
                context.Response.Filter = new GZipStream(context.Response.Filter, CompressionMode.Compress);
                SetEncoding(GZIP);
            }
            else if (IsEncodingAccepted(DEFLATE))
            {
                context.Response.Filter = new DeflateStream(context.Response.Filter, CompressionMode.Compress);
                SetEncoding(DEFLATE);
            }
        }

        /// <summary>
        /// Verifica os cabeçalhos da solicitação para ver se a
        /// codificação é aceita pelo cliente.
        /// </summary>
        private static bool IsEncodingAccepted(string encoding)
        {
            return HttpContext.Current.Request.Headers["Accept-encoding"] != null && HttpContext.Current.Request.Headers["Accept-encoding"].Contains(encoding);
        }

        /// <summary>
        /// Adiciona a codificação ao cabeçalho de resposta
        /// </summary>
        /// <param name="encoding"></param>
        private static void SetEncoding(string encoding)
        {
            HttpContext.Current.Response.AppendHeader("Content-encoding", encoding);
        }

        #endregion

        public bool IsReusable
        {
            get { return false; }
        }

    }

    public class ResourceModule : IHttpModule
    {

        #region IHttpModule Members

        void IHttpModule.Dispose()
        {

        }

        void IHttpModule.Init(HttpApplication context)
        {
            context.PostRequestHandlerExecute += new EventHandler(context_BeginRequest);
        }

        #endregion

        void context_BeginRequest(object sender, EventArgs e)
        {
            HttpApplication app = sender as HttpApplication;
            if (app.Context.CurrentHandler is Page && !app.Request.RawUrl.Contains("serviceframe"))
            {
                if (!app.Context.Request.Url.Scheme.Contains("https"))
                {
                    app.Response.Filter = new WebResourceFilter(app.Response.Filter);
                }
            }
        }

        #region Stream filter

        private class WebResourceFilter : Stream
        {

            public WebResourceFilter(Stream sink)
            {
                _sink = sink;
            }

            private Stream _sink;

            #region Properites

            public override bool CanRead
            {
                get { return true; }
            }

            public override bool CanSeek
            {
                get { return true; }
            }

            public override bool CanWrite
            {
                get { return true; }
            }

            public override void Flush()
            {
                _sink.Flush();
            }

            public override long Length
            {
                get { return 0; }
            }

            private long _position;
            public override long Position
            {
                get { return _position; }
                set { _position = value; }
            }

            #endregion

            #region Methods

            public override int Read(byte[] buffer, int offset, int count)
            {
                return _sink.Read(buffer, offset, count);
            }

            public override long Seek(long offset, SeekOrigin origin)
            {
                return _sink.Seek(offset, origin);
            }

            public override void SetLength(long value)
            {
                _sink.SetLength(value);
            }

            public override void Close()
            {
                _sink.Close();
            }

            public override void Write(byte[] buffer, int offset, int count)
            {
                byte[] data = new byte[count];
                Buffer.BlockCopy(buffer, offset, data, 0, count);
                string html = System.Text.Encoding.Default.GetString(buffer);
                int index = 0;
                List<string> list = new List<string>();

                Regex regex = new Regex("<script\\s*src=\"((?=[^\"]*(webresource.axd|scriptresource.axd))[^\"]*)\"\\s*type=\"text/javascript\"[^>]*>[^<]*(?:</script>)?", RegexOptions.IgnoreCase);
                foreach (Match match in regex.Matches(html))
                {
                    if (index == 0)
                        index = html.IndexOf(match.Value);

                    string relative = match.Groups[1].Value;
                    list.Add(relative);
                    html = html.Replace(match.Value, string.Empty);
                }

                if (index > 0)
                {
                    string script = "<script type=\"text/javascript\" src=\"js.axd?path={0}\"></script>";
                    string path = string.Empty;
                    foreach (string s in list)
                    {
                        path += HttpUtility.UrlEncode(s) + ",";
                    }

                    html = html.Insert(index, string.Format(script, path));
                }

                byte[] outdata = System.Text.Encoding.Default.GetBytes(html);
                _sink.Write(outdata, 0, outdata.GetLength(0));
            }

            #endregion

        }

        #endregion

    }
}

Adicione outra classe ao seu projeto, a minha eu chamei de “JavascriptManager” será responsável por adicionar a tag script nas páginas que usam o nosso controle.

Código da classe:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI.HtmlControls;
using System.Web.UI;

namespace EmbeddingJavascriptMyControl
{
    public static class JavascriptManager
    {
        /// <summary>
        /// Use este método para incluir um arquivo javascript na página
        /// </summary>
        /// <param name="_page">página que o arquivo deverá ser incluído</param>
        /// <param name="resourceName">caminho script</param>
        public static void IncludeResource(Page _page, string resourceName)
        {
            //aqui eu usei o nome EmbeddingJavascriptMyControl, mas você poderá usar o nome que quiser
            resourceName = "/EmbeddingJavascriptMyControl.axd?r=" + resourceName;

            HtmlGenericControl script = new HtmlGenericControl("script");
            script.Attributes.Add("type", "text/javascript");
            script.Attributes.Add("src", _page.ResolveClientUrl(resourceName));
            _page.Header.Controls.Add(script);
        }
    }
} 

Ufa! Já estamos quase lá. O bom disso é que só iremos ter o trabalho uma vez, e poderemos usar em todo o nosso projeto de componentes, podemos ter um ou cem componentes, sempre serão iguais e usarão os mesmos métodos.

Agora precisamos ajustar o nosso MyControl.cs para que ele faça a referência ao script que o controla.

Para isso, iremos sobrescrever o evento “OnInit”.

 protected override void OnInit(EventArgs e)
 {
 base.OnInit(e);

JavascriptManager.IncludeResource(Page,"MyControl");
 }

Você devará ter isso em todos os controles que você criar, eu tenho por hábito criar os controles e com os mesmos nomes dos arquivos.js, como eu fiz  com o MyControl.cs e MyControl.js, assim eu sei para que uso cada arquivo js, mesmo que fiquem em diretórios separados.

Feito isso, já podemos executar a nossa aplicação. Abra o código fonte da página e veja como ficou mais limpo. Economizamos algumas linhas e memória no navegador do cliente.

Percebam também que o nosso script foi registrado na tag head. Isso nos ajudará muito quando fizermos controles mais complexos e dinâmicos.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>
	Acessando recursos embutidos
</title><script type="text/javascript" src="/EmbeddingJavascriptMyControl.axd?r=MyControl"></script></head>
<body>
    <form name="form1" method="post" action="default.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTEzNjgwMjk4NDBkZMpc3l1d4uAY38/msqun4petNKEJ" />
</div>

    <div>
        <span id="myControl">Digite algo:
                            <input type='text' id='txtAlgo' />
                            <input type='button' value='Clique aqui' onclick='CallAlert(txtAlgo.value);' /></span>
    </div>
    </form>
</body>
</html>

Certo. Mas se você clicar no botão … dará o mesmo erro de sempre. “CallAlert não está definido”. Isso irá acontecer porque o nosso script é referenciado pela nossa url

<script type=”text/javascript” src=”/EmbeddingJavascriptMyControl.axd?r=MyControl“></script>

Veja que definimos um url diferente para o src de nosso script, é aqui que iremos usar o nosso handler e o module que criamos. É ele, o handler, quem será responsável por tratar o script e carregar no navegador, mas precisamente no cache do navegador.

Então vamos lá colocar o handler e o módulo para funcionar.

Voltamos ao nosso  projeto “EmbeddingJavascript” abra o arquivo “Web.config” nele precisamos configurar os nossos handlers e modules

Localize dentro do Web.config a chave <httpHandlers> antes da tag de fechamento iremos colocar o nosso handler

A minha ficou assim:

<httpHandlers>
	<remove verb="*" path="*.asmx"/>
	<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
	<add path="*/EmbeddingJavascriptMyControl.axd" verb="*" type ="EmbeddingJavascriptMyControl.ResourceHandler"/>
</httpHandlers>

Lembra do src do javascript? “/EmbeddingJavascriptMyControl.axd” é aqui que informamos quem será o manipulador do nosso handler.

Agora segue a declaração do módulo dentro do arquivo web.config. Declare entre as tags <httpModules> </httpModules>

<httpModules>
	<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
	<add name="EmbeddingJavascriptMyControlResourceModule" type="EmbeddingJavascriptMyControl.ResourceModule"/>
</httpModules>

Pronto. Agora pode executar a aplicação e clicar no botão. Se fez tudo correto. Vai funcionar. 🙂

Esta dica não serve apenas para javascript, com alguns ajustes no código do “ResourceHandler” você poderá usar para tratar imagens, css, e outros arquivos que forem necessários ao funcionamento do seu componente, mas nunca se esqueça de marcar como “Embedded Resource”.

A alteração que fizemos no web.config também podemos automatizá-la. Mas isso fica para um próximo artigo. Este já está muito extenso.

Segue o fonte do exemplo que eu usei no artigo [download id=”20″]


É isso ai pessoal 🙂
Até o próximo
? Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Introdução ao C# – Parte 3 – Enum e Casting

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (3 votos, média: 5,00 de 5)
Loading...
7 de outubro de 2011

C_thumb1

Pessoal

Segue abaixo mais um vídeo da nossa série sobre .NET Framework, C# e OOP (Programação Orientada a Objetos). E neste estamos dando sequencia a introdução a linguagem C#, tratando mais especificamente dos enumeradores (enum) e conversões entre tipos (casting).

YouTube responded to TubePress with an HTTP 410 - No longer available

Steve Jobs – Luto

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (3 votos, média: 5,00 de 5)
Loading...
6 de outubro de 2011

LUTO

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Ler webservice com javascript

7
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (2 votos, média: 5,00 de 5)
Loading...
24 de setembro de 2011

Ola Pessoal.

Conversando com um amigo pelo messenger estávamos discutindo o consumo de um web service usando JavaScript, sem usar frameworks, apenas JavaScript  puro.

A solução que encontrei foi esta que descrevo abaixo.

Primeiro iremos criar o nosso web service, este web service irá calcular a idade e retornar

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;

namespace WebService
{
    /// <summary>
    /// web service de exemplo
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    public class ws : System.Web.Services.WebService
    {

        /// <summary>
        /// Calcula a idade e retorna
        /// </summary>
        /// <param name="dia">dia de nascimento</param>
        /// <param name="mes">mes de nascimento</param>
        /// <param name="ano">ano de nascimento</param>
        /// <returns>idade</returns>
        [WebMethod]
        public int CalcularIdade(int dia, int mes, int ano)
        {
            if (ano.ToString().Length != 4) throw new Exception("O Ano deve ter 4 dígitos");

            DateTime hoje = DateTime.Today;
            DateTime dtNasc = new DateTime(ano, mes, dia);

            int anos = hoje.Year - dtNasc.Year;

            if (hoje.Month > dtNasc.Month)
                return anos;
            else if (dtNasc.Month == hoje.Month)
            {
                if (hoje.Day >= dtNasc.Day)
                    return anos;
                else return --anos;
            }
            else --anos;

            return anos;
        }
    }
}

Criaremos agora a página que irá consumir nosso web service, é uma página simples que pede três dados, Dia, Mês e Ano de nascimento.

Preste atenção na linha marcada. Não esqueça que devemos informar nosso arquivo javascript.
Aqui chamei o meu de acessarWS.js.

<html>
<head runat="server">
    <title>Teste de Webservice</title>

    <script language="javascript" type="text/javascript" src="acessarWS.js"></script>

</head>
<body>
    <p>
        Preencha os dados e clique em calcular</p>
    <div>
        Dia:<br />
        <input type="text" id="txtDia" />
        <br />
        <br />
        Mes:<br />
        <input type="text" id="txtMes" />
        <br />
        <br />
        Ano:<br />
        <input type="text" id="txtAno" />
        <br />
        <br />
        <button type="submit" onclick="CallWs();">
            Calcular</button>
    </div>
    <hr />
    <p>
        Resposta do servidor</p>
    <div id="divResponse">
    </div>
</body>
</html>

Ok! Criamos o nosso web service e agora precisamos criar o nosso JavaScript que irá consumir o web service.

O meu eu dei o nome de acessarWS.js.

var ajax;

/**
 * Criar o objeto ajax que vai fazer a requisição
 */
function CreateAjaxObject() {
	if(window.XMLHttpRequest) {// Mozilla, Safari, Novos browsers...
		ajax = new XMLHttpRequest();
	} else if(window.ActiveXObject) {// IE antigo
		ajax = new ActiveXObject("Msxml2.XMLHTTP");
		if(!ajax) {
			ajax = new ActiveXObject("Microsoft.XMLHTTP");
		}
	}

	if(!ajax)// iniciou com sucesso
		alert("Seu navegador não possui suporte para esta aplicação!");
}

/*
 * Envia os dados para a URL informada
 *
 * @param url Arquivo que irá receber os dados
 * @param dados dados a serem enviados no formato querystring nome=valor&nome1=valor2
 * @param AjaxResponseFunction  variável to tipo function(string) para receber a resposta do ajax
 */
function SendData(url, dados, AjaxResponseFunction) {
	CreateAjaxObject();
	if(ajax) {
		ajax.onreadystatechange = function trataResposta() {
			if(ajax.readyState == 4) {
				AjaxResponseFunction(ajax.status, ajax.responseText);
			}
		};
		//definir o tipo de método
		ajax.open("POST", url, true);

		//definir o encode do conteúdo
		ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");

		//tamanho dos dados enviados
		ajax.setRequestHeader('Content-length', dados.length);

		//enviar os dados
		ajax.send(dados);
	}
}

/**
 * Chama o webservice
 */
function CallWs() {
	/*
	    aqui passe os parâmetros do método.
	    no formato 'querystring'
	    ex:
	        nomeParam1=valor1&nomeParam2=valor2&nomeParamN=valorN

        Muita atenção aqui, pois deve ser informado aqui os nomes dos parâmetros
        que estão definidos no wsdl.
        Uma boa olhada, com atenção ao wsdl irá te mostrar os parâmetros,tipos e os nomes dos métodos
        disponíveis no método ou web service
	*/

	var dados = '';
	dados += 'ano=' + encodeURIComponent(txtAno.value);
	dados += '&mes=' + encodeURIComponent(txtMes.value);
	dados += '&dia=' + encodeURIComponent(txtDia.value);

	//aqui o caminho completo do webservice seguido do nome do método
	SendData("http://localhost/ws.asmx/CalcularIdade", dados, AjaxResponseFunction);
}

/**
 * tratar a resposta do servidor
 * @param status status da resposta
 * @response resposta do servidor
 */
function AjaxResponseFunction(status, response) {

    var divR = document.getElementById('divResponse');

    if(ajax.status != 200)
        divR.style.color = '#FF0000'; //vermelho
    else
        divR.style.color = '#0000FF';//azul

	//escrever na div de resposta
	divResponse.innerHTML = response;
}

Vamos dar uma olhada no WSDL que foi criado para o nosso web service.
Preste atenção nas linhas em destaque, elas mostraram o nome do nosso método e os parâmetros e tipos que devemos informar.

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" targetNamespace="http://tempuri.org/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
      <s:element name="CalcularIdade">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="dia" type="s:int" />
            <s:element minOccurs="1" maxOccurs="1" name="mes" type="s:int" />
            <s:element minOccurs="1" maxOccurs="1" name="ano" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:element name="CalcularIdadeResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="CalcularIdadeResult" type="s:int" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="CalcularIdadeSoapIn">
    <wsdl:part name="parameters" element="tns:CalcularIdade" />
  </wsdl:message>
  <wsdl:message name="CalcularIdadeSoapOut">
    <wsdl:part name="parameters" element="tns:CalcularIdadeResponse" />
  </wsdl:message>
  <wsdl:portType name="wsSoap">
    <wsdl:operation name="CalcularIdade">
      <wsdl:input message="tns:CalcularIdadeSoapIn" />
      <wsdl:output message="tns:CalcularIdadeSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="wsSoap" type="tns:wsSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="CalcularIdade">
      <soap:operation soapAction="http://tempuri.org/CalcularIdade" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:binding name="wsSoap12" type="tns:wsSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="CalcularIdade">
      <soap12:operation soapAction="http://tempuri.org/CalcularIdade" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="ws">
    <wsdl:port name="wsSoap" binding="tns:wsSoap">
      <soap:address location="http://localhost:2695/ws.asmx" />
    </wsdl:port>
    <wsdl:port name="wsSoap12" binding="tns:wsSoap12">
      <soap12:address location="http://localhost:2695/ws.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Um site que possui uma boa coleção de web services gratuitos é http://www.webservicex.net vale a pena uma visita para testar esta dica.


É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Skype Command Line

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (2 votos, média: 5,00 de 5)
Loading...
31 de agosto de 2011

Ola Pessoal.

Tenho recebido e-mails perguntando sobre como usar o Skype por linha de comando.

Não existe uma documentação boa sobre isso no site do Skype (http://www.skype.com/intl/pt-br/) então resolvi criar esta lista com os comandos que eu conheço.

Comando Descrição
Skype.exe /nosplash Exibe o Skype sem a janela de início, conhecida como splash screen.
Skype.exe /minimized Exibe o Skype e minimiza para o system tray (onde ficam os ícones, ao lado do relógio)
Skype.exe /datapath:”caminho Troque a palavra caminho por um novo caminho de diretório que você deseja que o Skype use como caminho alternativo para salvar as configurações.
Skype.exe /removable Use com /datapath. Não usa o caminho especificado se o mesmo não estiver disponível.
Skype.exe /callto:Nome Skype ou Número de telefone Use para fazer uma ligação pelo Skype.
Skype.exe /shutdown Fecha o skype
Skype.exe /secondary Inicia uma segunda instância do Skype se uma outra estiver aberta.
Skype.exe /username:seu nome /password:sua senha Inicia o skype com nome e senha especificados.Atenção: Cuidado ao usar este comando pois aplicações iniciadas por linha de comando podem facilmente mostrar a linha completa que foram usadas, mesmo depois de iniciadas.

Se você usar um explorador de processos, como o “Process Hacker” ele exibe a linha de comando completa que foi usada para iniciar a aplicação.

Veja na imagem abaixo:

Na tabela acima, troque o comando Skype.exe pelo caminho completo do Skype em sua máquina, aqui na minha é “C:\Program Files\Skype\Phone\Skype.exe”. Para eu utilizar tenho que fazer “C:\Program Files\Skype\Phone\Skype.exe” /Comando

Uma outra dica interessante é que você pode usar protocolos Skype para criar hyperlinks apenas colocando o Skype:NomeUsuario

Se você conhece mais algum comando passe-os pelos comentários e compartilhe.


É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s


História
Há algum tempo muito tem se falado sobre o tal Android, e muitas pessoas tem se interessado em desenvolver software e aplicativos para o mesmo, com uma plataforma de desenvolvimento do Java (JDK e SDK) é relativamente fácil desenvolver aplicativos simples para o Android.
Junto com essa facilidade o sistema foi “adotado” pelos fabricantes de clones chineses, é um ótimo sistema, grátis de vasta documentação e fácil instalação nos processadores da família MT65xx utilizados como processador desses celulares, o preço então nem se fala.
Recentemente adquiri um Hero H7000 chines, é uma cópia do HTC HD7 só que com o android 2.2.1 (froyo) instalado, e com bem menos recursos, o aparelho da empresa Hero é de muito boa qualidade, o meu já caiu umas 5 vezes só na primeira semana de uso. O objetivo era ter um aparelho novo, pois tive os meus furtados e usar como Debuger Device.
Meus problemas começaram assim que ele chegou, pois não possuí CD ou Manual, ou referência ao fabricante chines, nada que eu possa usar para chegar até os drivers, procurei na internet e achei muitos drivers para MT6516, porém somente servem para o celular “desligado” e não era esse o intuito. Depois de uma boa pesquisada em muitos sites, encontrei alguns passos e drivers para fazer e assim vou explicar como fiz funcionar no meu aparelho chines.

Como fazer

Bem, primeiro vamos aos requisitos básicos

  • Sistema Operacional Windows.
  • Eclipse instalado e rodando com o SDK da android.
  • Aparelho rodando Android 2.2.1 (não testei com outras versões).
  • Aplicativos [download id=”19″].
O processo é bem simples,
  1. Vá ao menu de seu celular -> Configurações -> Aplicativos e marque a opção Fontes Desconhecidas
  2. Entre na opção Desenvolvimento e marque os 3 itens disponíveis (Depuração USB, Permanecer ativo, Permitir locais fictícios)
  3. Faça o download do [download id=”19″] e extraia o arquivo.exe na pasta de sua preferência, segue o passo a passo da instalação

 
 
  Nesse passo precisamos parar o serviço do ADB que já foi instalado juntamente com o SDK do android Eu geralmente uso o CTRL+SHIFT+ESC para abrir o Gerenciador de Tarefas do Windows Organize por nome, o ADB geralmente é o primeiro da lista Ele vai perguntar se você deseja instalar um Device, a resposta é sim claro. Escolha a ultima opção como mostrada na imagem para celulares chineses Nessa parte você conecta o celular ao PC. Aqui ele finaliza a instalação.
Agora vamos ao nosso Eclipse para configurar o celular para rodar direto.
Abra o eclipse
 
 Vá as configurações de execução Na aba target, selecione manual e aperte em RUN. Selecione a device na parte de cima da próxima janela Pronto, aplicação rodando direto no aparelho 🙂
Espero que resolva o problema de muitas pessoas que estão tentando usar seus chineses baratinhos como debuger para o android, eu gostei muito do meu, é barato e resolve o problema, só fiquei insatisfeito com os 416Mhz que fazem dele um celular bem lento para a resolução de 800×600.
Abraços amigos e até uma próxima.

Ler XSD e Validar XML

2
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (3 votos, média: 5,00 de 5)
Loading...
13 de agosto de 2011

Escrever este artigo surgiu da necessidade de um amigo através de uma conversa por Skype®.
A necessidade dele era ler o arquivo XSD e não apenas validar o XML contra o XSD.
Aproveitando o gancho, eu fiz as duas coisas. A leitura do XSD e a validação pelo XSD.

Se você não sabe o que é um XSD: http://pt.wikipedia.org/wiki/XML_Schema

Eu não vou ensinar aqui a criar o XSD, pois isso daria assunto para outro artigo. 🙂
Caso queiram aprender a criar o XSD: http://www.w3schools.com/schema/schema_intro.asp

Ok! Agora que já temos uma base e já sabemos do que se trata. Vamos ao que interessa.

Primeiramente iremos criar o nosso XSD de validação do XML.
Irei chamar de endereco.xsd

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
	elementFormDefault="qualified"
	attributeFormDefault="unqualified"
>

	<!--definir os tipos primários do nosso xml-->
	<xs:simpleType name="TUF">
		<xs:annotation>
			<xs:documentation>Estado para usar no endereço</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:enumeration value="AC"/>
			<xs:enumeration value="AL"/>
			<xs:enumeration value="AM"/>
			<xs:enumeration value="AP"/>
			<xs:enumeration value="BA"/>
			<xs:enumeration value="CE"/>
			<xs:enumeration value="DF"/>
			<xs:enumeration value="ES"/>
			<xs:enumeration value="GO"/>
			<xs:enumeration value="MA"/>
			<xs:enumeration value="MG"/>
			<xs:enumeration value="MS"/>
			<xs:enumeration value="MT"/>
			<xs:enumeration value="PA"/>
			<xs:enumeration value="PB"/>
			<xs:enumeration value="PE"/>
			<xs:enumeration value="PI"/>
			<xs:enumeration value="PR"/>
			<xs:enumeration value="RJ"/>
			<xs:enumeration value="RN"/>
			<xs:enumeration value="RO"/>
			<xs:enumeration value="RR"/>
			<xs:enumeration value="RS"/>
			<xs:enumeration value="SC"/>
			<xs:enumeration value="SE"/>
			<xs:enumeration value="SP"/>
			<xs:enumeration value="TO"/>
		</xs:restriction>
	</xs:simpleType>

	<xs:simpleType name="TCEP">
		<xs:annotation>
			<xs:documentation>Tipo CEP</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:pattern value="[0-9\-]{9}"/>
		</xs:restriction>
	</xs:simpleType>

	<!--definir a estrutura do xml-->
	<xs:element name="enderecos">
		<xs:complexType>
			<xs:sequence>
				<xs:element name ="endereco" maxOccurs="unbounded">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="logradouro" type="xs:string"></xs:element>
							<xs:element name ="numero" type="xs:integer"></xs:element>
							<xs:element name="estado" type="TUF"></xs:element>
							<xs:element name="cep" type="TCEP"></xs:element>
							<xs:element name="bairro" type="xs:string"></xs:element>
							<xs:element name="cidade" type="xs:string"></xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
		</xs:complexType>
	</xs:element>
</xs:schema>

Ok! Criado o nosso xsd. Iremos criar mais dois arquivos endereco_erro.xml e endereco_ok.xml. Como os próprios nomes já dizem um com erro e um sem erro, para podermos testar nosso xsd.

endereco_erro.xml

<?xml version="1.0" encoding="utf-8" ?>
<enderecos>
	<endereco>
		<logradouro>rua nono NoNo no no </logradouro>
		<numero>123</numero>
		<estado>XX</estado>
		<cep>XXs111</cep>
		<bairro>NonnoNon</bairro>
		<cidade>Non on o nNOn</cidade>
	</endereco>
</enderecos>

endereco_ok.xml

<?xml version="1.0" encoding="utf-8" ?>
<enderecos>
	<endereco>
		<logradouro>rua nono NoNo no no </logradouro>
		<numero>123</numero>
		<estado>SP</estado>
		<cep>11111-111</cep>
		<bairro>NonnoNon</bairro>
		<cidade>Non on o nNOn</cidade>
	</endereco>
</enderecos>

Ok! Já temos os nossos xml’s e o nosso xsd. Agora precisamos do nosso aplicativo para ler o xsd e validar os xmls.

Para isso crie uma aplicação console no Visual Studio e cole o código abaixo na classe program.cs

Prestem atenção nas linhas em destaque. São nelas que iremos definir o nosso evento que irá capturar o erro do XML.

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Xml.Schema;

namespace XSD_XML
{
    class Program
    {
        static void Main(string[] args)
        {
            #region Ler o XSD

            WriteConsole("Lendo definição do arquivo XSD");
            //primeiro vamos ler nosso xsd. e ver suas definições
            XmlSchema schema = XmlSchema.Read(new XmlTextReader("xsd/endereco.xsd"), null);

            //lista os namespaces
            XmlQualifiedName[] namespaces = schema.Namespaces.ToArray();
            foreach (XmlQualifiedName item in namespaces)
                Console.WriteLine(string.Format("Nome: {0} Namespace: {1}", item.Name, item.Namespace));

            //lista os tipos
            string[] nomeTipo = null;

            foreach (object item in schema.Items)
            {
                nomeTipo = new string[3];

                if (item is XmlSchemaSimpleType)
                {
                    XmlSchemaSimpleType sType = item as XmlSchemaSimpleType;
                    nomeTipo[0] = sType.Name;
                    nomeTipo[1] = "SimpleType";

                    //lista as restrições deste tipo. Se houver
                    XmlSchemaSimpleTypeRestriction restriction = sType.Content as XmlSchemaSimpleTypeRestriction;
                    if (restriction != null)
                    {
                        foreach (XmlSchemaFacet facet in restriction.Facets)
                            nomeTipo[2] += facet.Value + ",";
                    }

                    Console.WriteLine(string.Format("Nome: {0} Tipo: {1} Restrição:{2} ", nomeTipo));
                }
                else if (item is XmlSchemaElement)
                {
                    //tipo elemento
                    XmlSchemaElement eType = item as XmlSchemaElement;
                    nomeTipo[0] = eType.Name;
                    nomeTipo[1] = eType.SchemaTypeName.Name;
                    nomeTipo[2] = "Não Tem";

                    Console.WriteLine(string.Format("Nome: {0} Tipo: {1} Restrição:{2} ", nomeTipo));

                    //le os itens deste elemento
                    WriteItens(eType);
                }
            }
            #endregion

            //criar o settings
            XmlReaderSettings settings = new XmlReaderSettings();

            /*
             * ATENÇÃO:
             * Aqui iremos definir o evento que será chamado se nosso xml tiver erros
             */

            settings.ValidationEventHandler += new ValidationEventHandler(validatingReader_ValidationEventHandler);
            settings.ValidationType = ValidationType.Schema;
            settings.Schemas.Add(schema);

            //abrir o xml com erro
            XmlReader validatingReader = XmlReader.Create("xml/endereco_erro.xml", settings);

            ////validar o xml
            WriteConsole("Validando o XML com erros");
            while (validatingReader.Read()) { };

            //xml sem erros
            validatingReader = XmlReader.Create("xml/endereco_ok.xml", settings);
            WriteConsole("Validando o XML sem erros");
            while (validatingReader.Read()) { };
            Console.ReadKey();
        }

        /// <summary>
        /// escreve os items de um elemento
        /// </summary>
        /// <param name="element">elemento xml</param>
        private static void WriteItens(XmlSchemaElement element)
        {
            System.Xml.Schema.XmlSchemaType type = element.SchemaType as System.Xml.Schema.XmlSchemaType;
            if (type == null) return;

            System.Xml.Schema.XmlSchemaComplexType complex = type as System.Xml.Schema.XmlSchemaComplexType;
            if (complex == null) return;

            System.Xml.Schema.XmlSchemaSequence sequence = complex.Particle as System.Xml.Schema.XmlSchemaSequence;
            if (sequence == null) return;

            WriteConsole("Linhas do tipo complexo", ConsoleColor.DarkMagenta);

            foreach (XmlSchemaElement item in sequence.Items)
            {
                Console.WriteLine(string.Format("Nome: {0}", item.Name));
            }
        }

        /// <summary>
        /// método de validação do XML. É aqui que iremos tratar o erro do nosso XML.
        /// </summary>
        /// <param name="sender">objeto que chamou o método</param>
        /// <param name="e">argumentos do evento</param>
        static void validatingReader_ValidationEventHandler(object sender, ValidationEventArgs e)
        {
            WriteConsole(e.Message, ConsoleColor.Red);
        }

        /// <summary>
        /// escreve uma linha no console
        /// </summary>
        /// <param name="message">mensagem</param>
        /// <param name="color">cor da mensagem</param>
        private static void WriteConsole(string message, ConsoleColor color)
        {
            Console.ForegroundColor = color;
            Console.WriteLine(message);
            Console.ResetColor();
        }

        /// <summary>
        /// Escreve uma linha no console. Cor padrão azul
        /// </summary>
        /// <param name="message">mensagem</param>
        private static void WriteConsole(string message)
        {
            WriteConsole(message, ConsoleColor.Blue);
        }

    }
}

Link para o download do projeto de exemplo. (formato .zip Visual Studio 2010) [download id=’16’]


É isso ai pessoal 🙂
Até o próximo
♦ Marcelo

About Marcelo

Nascido em Juruaia/MG em uma fazenda de criação de búfalos, e residindo na região Sul do Brasil. Trabalha com desenvolvimento de aplicações desde os 17 anos. Atualmente é Arquiteto Organizacional na Unimake Software. Para saber mais ... http://desenvolvedores.net/marcelo []'s

Introdução ao C# – Parte 2

0
1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (1 votos, média: 5,00 de 5)
Loading...
1 de agosto de 2011

C

Pessoal

Segue abaixo mais vídeo da série sobre .NET Framework, C# e OOP (Programação Orientada a Objetos) e neste estamos fazendo uma introdução a linguagem C#.

YouTube responded to TubePress with an HTTP 410 - No longer available
Page 3 of 6«12345»...Last »