Categorias
crash dicas iis

Corrigindo o problema do “Server Application Unavailable”

Esses dias me deparei com esse problema. Bem, h?? diversas causas que podem levar a isso e algumas solu????es podem ser facilmente encontradas pela net mostrando problemas:

E in??meros artigos/helps contendo outras solu????es/causas… Mas tamb??m h?? um caso devido ao Application PoolResumo: o Application Pool gerencia a mem??ria que ?? utilizada pelas aplica????es no IIS. N??o vou entrar em detalhes e serei bem direto na solu????o.

Bem, se voc?? deu de cara com o problema do Server Application Unavailable e j?? n??o sabe mais o que fazer (j?? criou e recriou in??meras vezes o site e deu na mesma), verifique todas as configura????es (novamente), veja se o Application Pool trabalhado est?? ativo e funcionando sobre a mesma vers??o do Framework .NET da aplica????o. Revise tamb??m a sua configura????o ou crie um novo e altere na configura????o do Web Site para o que foi criado. Isso deve resolver o problema…
Categorias
ssl

Redirecionando o endere??o para SSL no Global.asax

Post r??pido para redirecionar seu endere??o caso um usu??rio, ao digitar http://thiagomarcal.blogspot.com/, seja redirecionado automaticamente para https://thiagomarcal.blogspot.com/. Adicione um arquivo Global.asax e aplique o seguinte m??todo:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
     if (!Request.IsSecureConnection)
     {
          string endereco = string.Format(“https{0}”, Request.Url.AbsoluteUri.Substring(4));
          Response.Redirect(endereco);
     }
}

Categorias
c??digo de barras

Ler c??digo de barras atrav??s de um leitor ??ptico com ASP.NET

N??o h?? nenhum segredo ou driver espec??fico para realizar a leitura. Basicamente o leitor ??ptico l?? o c??digo de barras, converte para string e retorna para o buffer de entrada do computador. Ou seja, ?? como se fosse digitar no teclado! Acabou o mist??rio…
H?? v??rias formas de codifica????o do c??digo de barras e quem ?? respons??vel por essa codifica????o/decofica????o pode ser tanto a leitora quanto a aplica????o. Irei considerar em nosso exemplo que o que a leitora l?? e irei utilizar n??o me importando o que seja. Supondo e para fins ilustrativos que nosso c??digo de barras seja essa a?? de cima, o valor de entrada seria 3805565154 (frisando novamente, apenas supondo). A leitora ir?? passar para nossa aplica????o a seguinte entrada 3805565154 ENTER. A maioria das leitoras j?? facilitam sua vida for??ando o ENTER ao terminar de ler o conte??do. Ent??o fica f??cil! Vamos por a m??o na massa.
Crie uma tela com apenas um TextBox. Criei essa bonitinha aqui:

Selecione o TextBox, v?? na guia Properties e clique no ??cone de Events. Adicione um evento em KeyDown conforme a figura abaixo:

Com isso, ao digitar qualquer valor no TextBox, ir?? disparar esse evento. Mas como queremos ler apenas o valor completo, adicionamos uma determinada condi????o para come??ar a analisar apenas quando pressionar/entrar o ENTER, logo nosso c??digo ficaria da seguinte forma:
private void txtNumero_KeyDown(object sender, KeyEventArgs e)

{
        if (e.KeyCode == Keys.Enter)
        {
                string entrada = txtNumero.Text;
                txtNumero.Text = “”;
        }
}
 

Ou seja, a cada entrada de caracteres, ativo o evento mas s?? iniciarei a an??lise quando a entrada for um ENTER. Ao final, zero o conte??do do TextBox para que possa dar uma nova entrada. Da?? voc?? pode adicionar outras instru????es no meio para fazer o que quiser. Eu complementei a aplica????o fazendo uma consulta em um banco de dados e analisando se existe ou n??o um determinado cupom. Vamos aos testes…
A leitora que usei ?? plugada diretamente na entrada PS/2 do teclado. A depender de sua leitora pode ser na USB, na PS/2 ou utilizar algum adaptador espec??fico. Depois de conectado, inicie sua aplica????o. Posicione o leitor sobre o c??digo de barras e pressione o bot??o para realizar a leitura e voil??… Sua aplica????o ir?? ler a entrada e realizar o processo que desejar.
Minha aplica????o leu um cupom cujo n??mero codificado era 1000909. Bem f??cil e ??til… 
Quem quiser saber mais informa????es como tipos de codifica????es, como gerar/codificar/decodificar strings para c??digo de barras no Access, acessem esse artigo da MSDN que ?? bem interessante e explicativo.
Categorias
banco de dados firebird

ASP.NET com Banco Firebird

Semelhantemente com o post do MySQL, irei demonstrar como conectar a um banco Firebird usando o Framework (DLL) que eles disponilizam e que pode ser obtido aqui. Vou resumir o processo pois ?? bem parecido, da?? ?? s?? dar uma olhadinha r??pida no post anterior.
Basicamente incorpore a DLL no projeto e crie uma nova classe chamada Firebird. Adicione o namespace FirebirdSql.Data.FirebirdClient e adicione o seguinte c??digo para consulta:

FbConnection conexao = new FbConnection(“String Conex??o Firebird”);
FbCommand comando = new FbCommand();
FbDataReader datareader = null;
try
{
    conexao.Open();
    try
    {
        FbTransaction transacao = conexao.BeginTransaction();
        comando.Connection = conexao;
        comando.CommandText = “SELECT * FROM Tabela”;
        datareader = comando.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
        transacao.Commit();
    }
    catch (FbException erro) { }
}
catch (FbException erro) { }

Bem semelhante… nada de novo! Da?? pode-se gerar os demais m??todos de conex??o a partir desse. 
Vi em alguns t??picos pela NET que o pessoal encontra alguns problemas ao tentar conectar ao Firebird. O principal erro ??: “Your user name and password are not defined. Ask your database administrator to set up a Firebird login.”
Novamente, vi solu????es muito loucas e esdr??xulas mas que foram tentativas de ajudar e de boa vontade do pessoal. Bem, mesmo que seu login e senha estejam certos (e tenha certeza disso antes de reclamar), o Firebird, em comunica????o com a DLL, n??o d??o muita transpar??ncia e ajuda ao usu??rio. O problema, basicamente, ?? a string de conex??o. Basta usar essa:

User=SYSDBA; Password=masterkey; Database=C:BancosFirebirdThiago.fdb; DataSource=localhost; Port=3050; Dialect=3; Charset=NONE; Role=; Connection lifetime=15; Pooling=true; MinPoolSize=0; MaxPoolSize=50; Packet Size=8192; ServerType=0;

Ou

User=SYSDBA; Password=masterkey; Database=C:BancosFirebirdThiago.fdb; Server=localhost;

Problema resolvido!

Categorias
nfe nota fiscal eletr??nica salvador xml

Processo de Assinatura de Rps/Lote – Nota Fiscal Eletr??nica

Lendo aquele bolo de especifica????o da ABRASF muitos devem perguntar: “Certo, sei quais campos colocar no XML mas qual a ordem do processo de assinatura?”. A documenta????o n??o fica claro realmente como e qual a melhor forma de assinar. Realize a seguinte ordem:

  1. Gere o XML da Rps e assine;
  2. Se for enviar mais de uma Rps em um mesmo lote, repita o passo 1 para cada Rps;
  3. Anexe todas as Rps j?? assinadas no XML do Lote;
  4. Assine o Lote e fa??a o envio.

Seu XML de envio deve ficar semelhante ?? figura abaixo:

Para fazer a assinatura dos XMLs, utilize a fun????o abaixo:

private XmlDocument AplicaAssinatura(string xml, string uri)
{
try
{
// Obtem o certificado
X509Certificate2 X509Cert = ObtemCertificado();
// Cria um documento XML para carregar o XML
XmlDocument docXML = new XmlDocument();
docXML.PreserveWhitespace = true;
// Carrega o documento XML
docXML.LoadXml(xml);
// Cria o objeto XML assinado
SignedXml signedXml = new SignedXml(docXML);
// Assina com a chave privada
signedXml.SigningKey = X509Cert.PrivateKey;
// Atribui o m??todo de canoniza????o
signedXml.SignedInfo.CanonicalizationMethod = “http://www.w3.org/TR/2001/REC-xml-c14n-20010315”;
// Atribui o m??todo para assinatura
signedXml.SignedInfo.SignatureMethod = “http://www.w3.org/2000/09/xmldsig#rsa-sha1”;
// Cria a referencia
Reference reference = new Reference();
// Pega a URI para ser assinada
XmlAttributeCollection _Uri = docXML.GetElementsByTagName(uri).Item(0).Attributes;
foreach (XmlAttribute _atributo in _Uri)
{
if (_atributo.Name == “id”)
reference.Uri = “#” + _atributo.InnerText;
}
// Adiciona o envelope ?? refer??ncia
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
// Atribui o m??todo do Hash
reference.DigestMethod = “http://www.w3.org/2000/09/xmldsig#sha1”;
// Adiciona a referencia ao XML assinado
signedXml.AddReference(reference);
// Cria o objeto keyInfo
KeyInfo keyInfo = new KeyInfo();
// Carrega a informa????o da KeyInfo
KeyInfoClause rsaKeyVal = new RSAKeyValue((System.Security.Cryptography.RSA)X509Cert.PrivateKey);
KeyInfoX509Data x509Data = new KeyInfoX509Data(X509Cert);
x509Data.AddSubjectName(X509Cert.SubjectName.Name.ToString());
keyInfo.AddClause(x509Data);
keyInfo.AddClause(rsaKeyVal);
// Adiciona a KeyInfo
signedXml.KeyInfo = keyInfo;
// Atribui uma ID ?? assinatura
signedXml.Signature.Id = “Assigned” + uri;
// Efetiva a assinatura
signedXml.ComputeSignature();
// Obtem o XML assinado
XmlElement xmlDigitalSignature = signedXml.GetXml();
// Adiciona o elemento assinado ao XML
docXML.DocumentElement.AppendChild(docXML.ImportNode(xmlDigitalSignature, true));
// Retorna o XML
return docXML;
}
catch (Exception erro) { throw erro; }
}

O par??metro URI ?? o nome da tag geral que deve ser assinada de um XML, no caso dever?? assinar as tags InfRps (cada uma) e LoteRps. A fun????o ObtemCertificado j?? foi exibida aqui em um t??pico anterior que serve para captura do certificado digital.

Categorias
rss xml

Criar RSS

Depois de muito tempo voltei a escrever alguns artigos. Pouco tempo dispon??vel e algumas prioridades… Bem, esse t??pico, apesar de simples, ?? de bem ajuda para que desejar gerar RSS dinamicamente. O c??digo ?? bem simples: apenas Response!
Crie uma p??gina que ir?? exibir o RSS e coloque o seguinte c??digo no Page_Load:

StringBuilder rss = new StringBuilder();
rss.AppendLine(“<rss version=”2.0″>”);
rss.AppendLine(“<channel>”);
rss.AppendLine(“<title>Thiago Mar??al</title>”);
rss.AppendLine(“<link>http://thiagomarcal.blogspot.com/</link>”);
rss.AppendLine(“<description>Blog que compartilha id??ias e c??digo-fontes ?? comunidade.</description>”);
rss.AppendLine(“<language>pt-br</language>”);
SqlDataReader dr = consulta(“SELECT * “);
while (dr.Read())
{
        rss.AppendLine(“<item>”);
        rss.AppendLine(“<title>” + Funcoes.RemoveHTML(Server.HtmlDecode(dr[“titulo”].ToString())) + “</title>”);
        rss.AppendLine(“<description>” + Funcoes.RemoveHTML(Server.HtmlDecode(dr[“texto”].ToString())) + “</description>”);
        rss.AppendLine(“<link>” + dr[“link”].ToString() + “</link>”);
        rss.AppendLine(“<pubDate>” + DateTime.Parse(dr[“data”].ToString()).ToString(“dd/MM/yyyy HH:mm:ss”) + “</pubDate>”);
        rss.AppendLine(“</item>”);
}
rss.AppendLine(“</channel>”);
rss.AppendLine(“</rss>”);
dr.Close();
Response.ContentType = “text/xml”;
Response.Write(rss.ToString());

Bem simples, n??o? O m??todo Funcoes.RemoveHTML remove qualquer tag HTML que contenha na string. Eu criei uma bem simples baseada em express??o regular. Voc?? pode criar a seu gosto…