Mostrando postagens com marcador c#. Mostrar todas as postagens

Exibir solution Visual Studio

Como exibir icone solution Visual Studio:

 

Criptografia usando 3DES em C# e VB.Net

Exemplo de criptografia usando 3DES em C# e VB.Net
 


  Const passphrase As String = "2C446B15-732344-4234239-93234456-C1BC52F50478"

        Public Shared Function Criptografar(Message As String) As String
            Dim Results As Byte()
            Dim UTF8 As New System.Text.UTF8Encoding()
            Dim HashProvider As New MD5CryptoServiceProvider()
            Dim TDESKey As Byte() = HashProvider.ComputeHash(UTF8.GetBytes(passphrase))
            Dim TDESAlgorithm As New TripleDESCryptoServiceProvider()
            TDESAlgorithm.Key = TDESKey
            TDESAlgorithm.Mode = CipherMode.ECB
            TDESAlgorithm.Padding = PaddingMode.PKCS7
            Dim DataToEncrypt As Byte() = UTF8.GetBytes(Message)
            Try
                Dim Encryptor As ICryptoTransform = TDESAlgorithm.CreateEncryptor()
                Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length)
            Finally
                TDESAlgorithm.Clear()
                HashProvider.Clear()
            End Try
            Return Convert.ToBase64String(Results)
        End Function


        Public Shared Function Descriptografar(Message As String) As String
            Dim Results As Byte()
            Dim UTF8 As New System.Text.UTF8Encoding()
            Dim HashProvider As New MD5CryptoServiceProvider()
            Dim TDESKey As Byte() = HashProvider.ComputeHash(UTF8.GetBytes(passphrase))
            Dim TDESAlgorithm As New TripleDESCryptoServiceProvider()
            TDESAlgorithm.Key = TDESKey
            TDESAlgorithm.Mode = CipherMode.ECB
            TDESAlgorithm.Padding = PaddingMode.PKCS7
            Dim DataToDecrypt As Byte() = Convert.FromBase64String(Message)
            Try
                Dim Decryptor As ICryptoTransform = TDESAlgorithm.CreateDecryptor()
                Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length)
            Finally
                TDESAlgorithm.Clear()
                HashProvider.Clear()
            End Try
            Return UTF8.GetString(Results)
        End Function


 


const string passphrase = "2CDD6B23-7345-45789-93565-C3453345345G43453F38";
    public static string Criptografar(string Message)
    {
        byte[] Results = null;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
        byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(passphrase));
        TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
        TDESAlgorithm.Key = TDESKey;
        TDESAlgorithm.Mode = CipherMode.ECB;
        TDESAlgorithm.Padding = PaddingMode.PKCS7;
        byte[] DataToEncrypt = UTF8.GetBytes(Message);
        try
        {
            ICryptoTransform Encryptor = TDESAlgorithm.CreateEncryptor();
            Results = Encryptor.TransformFinalBlock(DataToEncrypt, 0, DataToEncrypt.Length);
        }
        finally
        {
            TDESAlgorithm.Clear();
            HashProvider.Clear();
        }
        return Convert.ToBase64String(Results);
    }


    public static string Descriptografar(string Message)
    {
        byte[] Results = null;
        System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
        MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
        byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(passphrase));
        TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
        TDESAlgorithm.Key = TDESKey;
        TDESAlgorithm.Mode = CipherMode.ECB;
        TDESAlgorithm.Padding = PaddingMode.PKCS7;
        byte[] DataToDecrypt = Convert.FromBase64String(Message);
        try
        {
            ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
            Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
        }
        finally
        {
            TDESAlgorithm.Clear();
            HashProvider.Clear();
        }
        return UTF8.GetString(Results);
    }


Retornando propriedades e valores de um objeto

Exemplo de como retornar valores e nomes de todas propriedades de um objeto usando C# ou VB.Net:

  
foreach(PropertyDescriptor descriptor in TypeDescriptor.GetProperties(obj))
{
    string name=descriptor.Name;
    object value=descriptor.GetValue(obj);
    Console.WriteLine("{0}={1}",name,value);
}


        For Each descriptor As PropertyDescriptor In TypeDescriptor.GetProperties(DateTime.Now)
            Dim name As String = descriptor.Name
            Dim value As Object = descriptor.GetValue(DateTime.Now)
            Console.WriteLine("{0}={1}", name, value)
        Next

Adicionando um validador dinâmico a página

Muitas vezes precisamos criar um validador no Asp.Net que não está ligado a nenhum controle, apenas valida uma regra de negócio específica da área que estamos trabalhando. Neste post montei um pequeno exemplo de como fazer isso.

O primeiro passo é criar uma classe que estenda a classe abstrata System.Web.UI.WebControls.BaseValidator e também implementar a interface System.Web.UI.IValidator conforme abaixo:

using System;
using System.Web.UI;
using System.Web.UI.WebControls;


public class DynamicValidator : BaseValidator, IValidator
{
    //Declaração do Delegate que define a assinatura do método que irá fazer a validação.
    //Para fins de exemplo(preguiça :P) não foi seguido o padrão de usar a assinatura "object sender, EventArgs e" 
    public delegate void DynamicValidatorDelegate(out Boolean IsValid);

    //Declarando o evento que irá guardar o método de validação
    public event DynamicValidatorDelegate OnValidate;

    //Implmentando o método Validate da interface IValidator. 
    //A classe BaseValidator já implementa a interface IValidator, porém se você não reimplementa este método é 
    //lançado exceção quando ele tenta achar o ControlToValidate para poder chamar o método internamente.
    void IValidator.Validate()
    {
        Boolean IsValid;
        OnValidate(out IsValid);
        this.IsValid = IsValid;
    }

    //Este método é obrigatório sobrescrever uma vez que a classe BaseValidator é abstrata.
    protected override Boolean EvaluateIsValid()
    {
        Boolean IsValid;
        OnValidate(out IsValid);
        return IsValid;
    }

}

Observe que na classe foi declarado um evento chamado OnValidate. Este evento deve ser populado com o método quer irá fazer a validação.

Outro ponto é que se você espera que a mensagem seja exibida em algum ValidationSummary da página a propriedade ValidationGroupdeve ser preenchida, do contrário não será exibido nada que indique ao seu usuário o erro.

Agora vamos usar o validador. Para isso imagine que você tem uma página com uma regra de negócio onde um botão só pode ser acionado das 22 horas até às 23. Abaixo veja o .aspx desta página:


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

<!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 runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ValidationSummary ID="vsTeste" runat="server" ValidationGroup="RegraDinamica" />
        <asp:Button ID="Button1" runat="server" Text="Validar" 
            onclick="Button1_Click" />    
    </div>
    </form>
</body>
</html>

Agora dentro do evento deste botão vamos instanciar nossa classe e adiona-la a página conforme abaixo:

using System;
using System.Web.UI;

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        DynamicValidator validador = new DynamicValidator();

        //Coloco o validador no mesmo ValidationGroup do meu ValidationSummary
        validador.ValidationGroup = "RegraDinamica";

        //Preencho a mensagem de crítica que eu quero exibir caso a validação não passe
        validador.ErrorMessage = "Esta operação só pode ser realizada das 22:00 horas até as 23:00.";

        //Defino o método que irá fazer a validação, neste caso o ValidarHorario que está declarado mais abaixo
        validador.OnValidate += ValidarHorario;

        //Adiciono o validador a página
        Page.Validators.Add(validador);

        //Chamo a validação no ValidationGroup em que o validador está
        Page.Validate("RegraDinamica");
        if (Page.IsValid)
        {
            //Excuto código aqui
        }
    }

    //Método utilizado para validar o horário, como não é possivel retornar valor em eventos então é necessário 
    //utilizar a técnica de passar a variável como parâmetro usando o out
    public void ValidarHorario(out Boolean IsValid)
    {
        //Valido se a data atual está entre as 22 horas e as 23 horas, apenas fins para teste
        IsValid = (DateTime.Now.Hour > 22 && DateTime.Now.Hour < 23);
    }
}

Só uma dica: pense que través dessa técnica você pode colocar a validação dentro de sua camada de negócio ;).

Download do exemplo

Usando a API do Linkedin no ASP.Net

Exemplo de como se usar a API do Linkedin usando o ASP.Net.

Download

Pasta de cache de web sites do Visual Studio

Algumas vezes tive problemas com referências de controles de alguns projetos que não dão building completamente. Para resolver eu tive que limpar a seguinte pasta, que é onde o visual studio guarda o cache de web sites:

C:\Users\UserName\AppData\Local\Temp\Temporary ASP.NET Files

If inline Vb.Net e C#

Muitas vezes precisamos fazer um if-else bem simples apenas para retornar um valor, é ai que entra em campo o "if inline" que a maioria das linguagens possui.

Descobri recentemente o do VB e decidi compartilhar:

 
Dim valor = IIf(condicao, "Verdadeiro", "Falso")
 
string valor = condicao ? "Verdadeiro" : "Falso";

Exemplo de com chamar um método dinamicamente

Exemplo de com chamar um método dinamicamente:
//Carregando DLL
Assembly assembly = Assembly.Load(AssemblyName);
//Carregando Classe
Type classe = assembly.GetType(Namespace);
//Carregando Método
MethodInfo metodo = classe.GetMethod("ValidarCampo");
//Criando instancia da classe
object objeto = Activator.CreateInstance(classe);
//Criando parâmetros do método
object[] parametros = new object[] { ("Param1", "Param2" };
//Chamando método
object retorno = metodo.Invoke(objeto, parametros);

Trabalhando com controles dinâmicos em ASP.NET

Um pequeno exemplo de como trabalhar com controles dinâmicos.
Para facilitar eu achei melhor não encher o código do comentário explicando linha por linha. Isto iria poluir muito, e no final não seria possível para entender nada. Vou descrever aqui a ideia básica do código e no final do post eu coloco um pequeno FAQ para esclarecer mais alguns detalhes.
Quando o usuário clica no botão "Adicionar" a aplicação adiciona um novo TextBox no Panel. Já quando o usuário clica em salvar eu imprimo os valores, para provar que os controles não estão perdendo valor.
Para fazer a coisa toda funcionar o segredo está em sempre re-adicionar os controles nos eventos Page_Load ou Page_Init. Uma vez que o usuário clicou em "Adicionar", não basta apenas criar o controle e esperar que no próximo PostBack ele esteja lá. Ele não estará.
No meu caso como só vou adicionar TextBox a única coisa que eu precisei fazer foi criar um campo HiddenField para guardar a quantidade de controles que eu já havia criado.
Em problemas mais complexos, onde existirá mais de um tipo de controle, ou o usuário poderá apagar os controles, será necessário guardar essas informações na ViewState. Nesse caso os controles devem ser recriados no evento Page_Load porque a ViewState ainda não existe no evento Page_Init
   <asp:Button ID="btnAddControle" runat="server" Text="Adicionar" OnClick="btnAddControle_Click" />
   <asp:Panel ID="pnlControles" runat="server">
   </asp:Panel>
   <asp:HiddenField ID="hdfQtdControles" runat="server" Value="0" />
   <asp:Button ID="btnSalvar" runat="server" Text="Salvar" OnClick="btnSalvar_Click1" />
   <br />
   <asp:Literal ID="ltlResultado" runat="server">

protected void Page_Init(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        for (int i = 0; i < int.Parse(Request.Params[hdfQtdControles.ClientID.Replace("_", "$")].ToString()); i++)
        {
            
            TextBox txtControle = new TextBox()
            {
                ID = "txtControle" + pnlControles.Controls.Count
            };

            pnlControles.Controls.Add(txtControle);
        }
    }
}

protected void btnAddControle_Click(object sender, EventArgs e)
{
    TextBox txtControle = new TextBox()
    {
        ID = "txtControle" + pnlControles.Controls.Count
    };

    pnlControles.Controls.Add(txtControle);

    hdfQtdControles.Value = (pnlControles.Controls.Count - 1).ToString();
}

protected void btnSalvar_Click1(object sender, EventArgs e)
{
    ltlResultado.Text = "";
    foreach (var txtControle in pnlControles.Controls)
    {
        try
        {
            TextBox txtControleTextBox = (TextBox)txtControle;
            ltlResultado.Text += txtControleTextBox.ID + ": " + txtControleTextBox.Text + "
";
        }
        catch (System.InvalidCastException) { }
    }
}

A hora der um tempo prometo que faço o FAQ ;-).

Código Fonte: http://db.tt/ETpCOqKb

Fazer um GridView encadeado (Grid Pai -> Grid Filho)

Um pequeno exemplo de como montar um GridView encadeado. Isso é muito útil quando é necessário agrupar valores por suas categorias.


    
        
            
                
                
                <%-- No dia a dia será mais comum usar uma função no DataSource que retorne os dados da linha atual assim: <%# GetAlimentosById(int.Parse(Eval("IdCategoriaAlimentos").ToString())) %>  --%>
                
                    
                        
                            
                                
                            
                        
                    
                
            
        
    


protected void Page_Load(object sender, EventArgs e)
{
    //Criando uma carga de dados inicial para teste. Assim não precisamos envolver pesquisa à banco no exemplo
    List<CagoriaAlimento> categoriasAlimento = new List<CagoriaAlimento>{
         new CagoriaAlimento(){
            Nome = "Lanches",
            Alimentos = new List<Alimento>
            {
                new Alimento(){
                    Nome = "X-Tudo"
                },
                new Alimento(){
                    Nome = "X-Bacon"
                },
                new Alimento(){
                    Nome = "X-Egg"
                }
            }
        },
        new CagoriaAlimento(){
            Nome = "Naturebas",
            Alimentos = new List<Alimento>
            {
                new Alimento(){
                    Nome = "Salada de alfaçe"
                },
                new Alimento(){
                    Nome = "Bife de soja" //eca
                }
            }
        }
    };

    //Populando o grid
    gvwCategoriasDeAlimentos.DataSource = categoriasAlimento;
    gvwCategoriasDeAlimentos.DataBind();
}



class CagoriaAlimento
{
    public String Nome { get; set; }
    public List<Alimento> Alimentos { get; set; }
}

class Alimento
{
    public String Nome { get; set; }
}

E eis o resultado:

Só falta um pouco de css ;-) .

Diferença entre Reference Type e Value Types

Ótimo artigo falando sobre as diferenças entre reference type e value types no Dot.Net. Vale à pena ler:

http://www.albahari.com/valuevsreftypes.aspx

Usando sleep no DotNet

Quem já programa há algum tempo com certeza vai lembrar do comando sleep de linguagens mais antigas. O que esse comando normalmente faz é parar o fluxo da aplicação por algum tempo determinado.

Como tudo no dotnet roda através de threads, basta usar este comando para parar a thread atual e obter o mesmo efeito:

    //O parâmetro é um integer contendo o tempo em milissegundos que a thread irá ficar parada
    System.Threading.Thread.Sleep(20000);
    'O parâmetro é um integer contendo o tempo em milissegundos que a thread irá ficar parada
    System.Threading.Thread.Sleep(20000)

Esta técinica funciona tanto para aplicações clientes quanto para aplicações servidor (Asp.Net).

Como atribuir null para tipos como lnt, bool, char...

Muitas vezes no dia a dia um boolean pode ser não só true e false, mas também null. Além do boolean os seguintes tipos não aceitam null diretamente:

  • Char
  • Byte
  • sbyte
  • ushort
  • Int
  • Uint
  • Long
  • ulong
  • Float
  • Double
  • Decimal
  • Bool
  • struct

A solução para esse problema é o uso da classe System.Nullable. Existem duas formas de instanciar uma variável usando essa classe, como demostrado abaixo:

    System.Nullable<int> foo = null;

    int? bar = null;

Uma vez declarado a variável ela terá duas propriedades a mais:

  • Value: retorna o conteúdo armazenado na variável. Caso o valor armazenado seja null será lançado a seguinte exception: System.InvalidOperationException.
  • HasValue: retorna false caso o valor armazenado seja null, e true se o valor não for null.

Quando usar essa técnica tome sempre cuidado em verificar se o valor da variável é null, ou em tratar as possíveis exceções, conforme abaixo:

    //Verificando antes
    System.Nullable<int> foo = null;
    if (foo.HasValue)
    {
        foo = foo.Value * 10;
    }

    //Tratando exception
    System.Nullable<int> bar = null;
    try
    {
        bar = bar.Value * 10;
    }
    catch (System.InvalidOperationException){ }


Convertendo string para enum através do rótulo

Exemplo de como converter uma uma string em enum, usando o rótulo.

enum Status {
    Ativo,
    Inativo,
    Aguardando
};

Status _status = (Status)Enum.Parse(typeof(Status), "Inativo");

//
Enum Status 
    Ativo
    Inativo
    Aguardando
End Enum

Dim _status AS Status = DirectCast([Enum].Parse(GetType(Status), "Inativo", True), Status)

'

Só não esqueça de tratar as exceções: System.ArgumentNullException e System.ArgumentException. ;-)

Converter c# para VB.Net


Quem programa em c# e esporadicamente tem que fazer algo em VB.Net (Ou vice versa), sabe que algumas diferenças entre as linguagens podem ser bem chatinhas de se lembrar. Felizmente existe este site que converte tanto de c# para VB, quanto de VB para c#.


Tenho usado ele já há algum tempo e nunca tive problemas, mesmo em códigos mais complexos.