Categorias
ftp time-out upload

Sanando o “The request was aborted: The request was canceled.” no upload

Nome do post meio estranho, mas vamos l??!
Esses dias, fazendo um uploadzinho maroto, o cliente precisou enviar um arquivo “grande” s?? que na hospedagem dele, mesmo adicionando os par??metros de configura????o no web.config como executionTimeoutmaxRequestLengthmaxAllowedContentLength, etc, continuava o erro. Dando uma vasculhada na net algumas pessoas resolveram colocando o KeepAlive como false mas eu estava usando o WebClient que n??o tem o atributo e n??o queria reprogramar o que j?? havia feito. Eis que encontro uma solu????o que caiu como uma luva mesmo n??o usando o atributo.
Adicione ao projeto a classe ExtendedWebClient conforme o c??digo abaixo:

public class ExtendedWebClient : WebClient
{
    public int Timeout { get; set; }
    public new bool AllowWriteStreamBuffering { get; set; }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        if (request != null)
        {
            request.Timeout = Timeout;
            var httpRequest = request as HttpWebRequest;
            if (httpRequest != null)
            {
                httpRequest.AllowWriteStreamBuffering = AllowWriteStreamBuffering;
            }
        }
        return request;
    }

    public ExtendedWebClient()
    {
        Timeout = 100000;
    }
}

Ent??o, agora ?? apenas substituir o WebClient por ExtendedWebClient ficando assim:

ExtendedWebClient ftp = new ExtendedWebClient();
ftp.Timeout = Timeout.Infinite;
ftp.AllowWriteStreamBuffering = false;

E o resto segue! 
Pode utilizar o KeepAlive? Pode! Basta fazer da mesma forma que o AllowWriteStreamBuffering.

Categorias
hotspot mikrotik

Implementa????o do ASP.NET (C#) com o Mikrotik (Hotspot)

Esse projeto at?? hoje tem demanda e, a pedidos de voc??s, coloquei um pequeno projeto no GitHub para que possamos ir incrementando pouco a pouco com nossas id??ias e sugest??es. Hoje est?? bem b??sico e fiz o mais r??pido poss??vel para dar aquela forcinha.
Est?? em WebForm para que fique bem entend??vel e sirva de base para utilizar com outras linguagens de programa????o (PHP, Java, etc).
Lembrando que no post anterior, https://blog.thiagomarcal.com.br/adicionando-uma-pagina-de-cadastro-de-usuarios-hotspot-em-asp-net-no-mikrotik/, tem toda a configura????o inicial e muitos de voc??s manjam melhor do que eu com o Mikrotik. Beleza?
D??vidas, sugest??es, corre????es, etc deixem nos coment??rios. Se quiserem algo muito espec??fico e queiram me presentear com um Mikrotik, eu aceito! 🙂

Download: https://github.com/tmarcal/Mikrotik

Categorias
installshield windows service

No feriado, vamos resolver problemas

Dica r??pida para que est?? tendo o erro “Could not create _isconfig.xml for use with InstallUtilLib.dll” ao compilar um projeto de instala????o (InstallShield). O nome do projeto que est?? sendo instalado n??o pode ser igual ao nome do projeto de instala????o (e vice-versa). 😀

Categorias
seguran??a web.config

Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.

Retornando das cinzas com dicas, macetes e artigos depois de tanto tempo e in??meros e-mails o bom filho a casa torna. Restaurando os e-mails de alguns internautas duvidosos, muitos se depararam o erro:

“Unable to load one or more of the requested types. Retrieve the LoaderExceptions property for more information.”

Geralmente sempre acontece quando tentam publicar uma aplica????o em um servidor externo e dizem: na minha m??quina estava funcionando! N??o ??? Se identificou? Adicionem no web.config o n??vel de seguran??a:

<system.web>    
     <trust level=Full/> 
</system.web>

E se n??o der para adicionar ou se n??o funcionar? Rapaz, esse assunto ?? pol??mico (envolve seguran??a, bla bla bla). Tem servidores e servidores e n??o vale a dor de cabe??a de ter adaptar demais sua aplica????o para o que o provedor te oferece. Acredito que para uma boa rela????o ambos tem que caminhar de m??o dadas.

Categorias
application diret??rio virtual dll iis site windows

Convertendo uma pasta em aplica????o no IIS via c??digo (C#)

Somente pelo IIS ?? poss??vel converter uma pasta em aplica????o? Mais ou menos. Na vers??o 7 do IIS j?? disp??e de m??dulos que simplificam o processo de cria????o de site, diret??rio virtual, pools de aplica????o e as aplica????es em si. Nesse artigo mostrarei bem r??pido como converter uma pasta em uma aplica????o.

Crie sua aplica????o e adicione, como refer??ncia, o bin??rio Microsoft.Web.Administration.dll que fica na pasta C:WindowsSystem32inetsrv . Agora adicione o seguinte c??digo:

using Microsoft.Web.Administration;

private void CriaEntradaIIS(string diretorio)
    {
        try
        {
            // Cria a pasta do site
            if (!Directory.Exists(diretorio))
                Directory.CreateDirectory(diretorio);


            // Servidor de Aplica????o
            ServerManager sm = new ServerManager();


            // Captura o site raiz onde ir?? adicionar a aplica????o
            Site st = sm.Sites[“Default Web Site”];


            // Cria a aplica????o no diret??rio criado apontando o caminho, ex: aplicacao
            Application app = st.Applications.Add(“/aplicacao”, diretorio);
            app.ApplicationPoolName = “ASP.NET v4.0”;
            sm.CommitChanges();


            // Libera
            sm.Dispose();
        }
        catch (Exception erro)
        {
            return;
        }
    }

Se tentar executar dar?? erro… Antes d?? permiss??o total ao grupo Servi??o de Rede (Network Service) ?? pasta C:WindowsSystem32inetsrvconfig . Agora sim ir?? criar. Para mais exemplos veja nesse post aqui.

Categorias
componentes dll ghostscript imagem pdf upload winform

Converter PDF em Imagem em C# com GhostScript

Esse ?? um artigo bem old, mas que muita gente me enviou e-mails pedindo como fazer isso. Ent??o criei um artigo bem resumido baseado no de Lord TaGoH. Primeiramente, voc?? precisa ter a DLL do GhostScript em seu projeto: ou voc?? instala ou pega de algu??m que j?? tenha instalado. O arquivo que me refiro ?? o gsdll32.dll. Obs: a convers??o s?? funciona para as vers??es mais recentes ent??o pegue alguma a partir da vers??o 9 como garantia.

Lembra do meu ??ltimo post de scaneamento? Adicionei um bot??o de anexar um PDF e converter em imagem, ent??o irei aproveitar a mesma aplica????o adicionando essa funcionalidade. Copie a DLL para seu projeto e, em Propriedades, deixe configurado o atributo Copiar sempre para quando for compil??-la caso seja um Windows Form. Se for um Web Form, adicione em algum local onde a classe conversora possa encontr??-la.

Na p??gina do CodeProject disp??e de uma classe (bin??ria) j?? pronta para uso uso da DLL chamada de PdfToImage. Ent??o voc?? podem baixar de l?? ou aqui. Baixado a DLL, voc?? pode adicionar como refer??ncia ao seu projeto/p??gina. Agora ?? s?? c??digo…

using PdfToImage;

// Objeto de convers??o
PDFConvert converter = new PDFConvert();

// Arquivo PDF selecionado de um OpenFileDialog
string arquivo = FileUploadSelect.FileName;

// Local de sa??da do arquivo convertido
string output = _directoryForImages + “LJ_” + _loja + “_Scan_” + DateTime.Now.ToString(“yyyy_MM_dd_HH_mm_ss”) + “.jpg”;

// Configura????es de convers??o
converter.OutputToMultipleFile = false;
converter.TextAlphaBit = 4;
converter.FirstPageToConvert = 1;
converter.LastPageToConvert = 1;
converter.FitPage = false;
converter.JPEGQuality = 10;
converter.OutputFormat = “png16m”;

// Faz a convers??o e retorna true se estiver tudo OK
bool resultado = converter.Convert(arquivo, output);

Pronto! Mais f??cil do que isso imposs??vel. Fique atento ??s configura????es de convers??o, sen??o n??o funciona.

Categorias
componentes dll scanner windows winform

Scanear um documento com C#

Um dos melhores componentes de scaneamento que j?? utilizei ?? o da VintaSoft. Ele n??o ?? free, mas pode ser utilizado normalmente. O ??nico empecilho ?? que, para cada scan que fizer, ele ir?? solicitar que clique em Evaluate. Quem comprar, vale a pena pois ?? muito bom e seu suporte sempre est?? a disposi????o. Chega de elogios e vamos ao que interessa.

O componente permite tanto utilizar em Windows Form quando Web Form e no site h?? todos os exemplos necess??rios. Baixe o componente e instale. Para nosso exemplo, trabalharemos com um Windows Form. Fiz uma pequena aplica????o de scanear nota fiscal.

V?? na pasta de instala????o do componente, copie o arquivo Vintasoft.Twain.dll para sua aplica????o e adicione como refer??ncia. No Code-Behind do formul??rio a ser trabalhado, adicione o seguinte c??digo para inicializar o componente:

using Vintasoft.Twain;


// Carrega o gerenciador de dispositivo
DeviceManager _deviceManager = new DeviceManager();
Device _device;


// Avalia se ?? um dispositivo ??til
if (!_deviceManager.IsTwainAvailable)
{
           MessageBox.Show(“N??o ?? um dispositivo TWAIN!”, “Erro”, MessageBoxButtons.OK, MessageBoxIcon.Error);
           return;
}


try
{
           // Abre o gerenciador de dispositivo
           _deviceManager.Open();
           // Seta o dispositivo corrente
           _device = _deviceManager.Devices.Current;
           lblDipositivo.Text = _deviceManager.Devices.Current.Info.ProductName;
}
catch (TwainDeviceManagerException ex)
{
           MessageBox.Show(ex.Message, “Gerenciador de Dispositivos”);
           return;
}

Agora, ao clicar no bot??o Scannear, adicionamos o seguinte m??todo:

private void btnScanear_Click(object sender, EventArgs e)
        {
            try
            {
                // Seta as configura????es
                _device.TransferMode = TransferMode.File;
                try
                {
                    _device.ShowUI = false;
                    _device.ShowIndicators = false;
                    _device.DisableAfterAcquire = true;
                }
                catch { }


                // Abre o dispositivo
                _device.Open();


                // Propriedades do scaneamento
                try
                {
                    _device.UnitOfMeasure = UnitOfMeasure.Inches;
                    _device.Resolution = new Resolution(float.Parse(resolucaoX.SelectedItem.ToString()), float.Parse(resolucaoY.SelectedItem.ToString()));
                }
                catch { }


                // Informa????o sobre o arquivo
                _arquivo = “LJ_” + _loja + “_Scan_” + DateTime.Now.ToString(“yyyy_MM_dd_HH_mm_ss”) + “.jpg”;
                _device.FileName = _directoryForImages + _arquivo;
                //_device.FileFormat = TwainImageFileFormat.Jpeg;


                // Captura a imagem
                AcquireModalState acquireModalState = AcquireModalState.None;
                do
                {
                    acquireModalState = _device.AcquireModal();
                    switch (acquireModalState)
                    {
                        case AcquireModalState.ImageAcquired:


                            _device.FileName = _directoryForImages + _arquivo;
                            //_device.FileFormat = TwainImageFileFormat.Jpeg;
                            break;


                        case AcquireModalState.ScanCompleted:


                            CloseDevice();


                            break;


                        case AcquireModalState.ScanCanceled:


                            CloseDevice();


                            break;


                        case AcquireModalState.ScanFailed:


                            CloseDevice();


                            break;


                        case AcquireModalState.UserInterfaceClosed:


                            CloseDevice();


                            break;
                    }
                }
                while (acquireModalState != AcquireModalState.None);
            }
            catch (TwainException ex)
            {
                MessageBox.Show(ex.Message + ” – “ + ex.StackTrace, “Erro”, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

E outros m??todos s??o necess??rios adicionar ao form, como:

        /// Fecha o dispositivo e a ger??ncia

        private void CloseDeviceAndDeviceManager()
        {
            // Verifica de h?? dispositivo
            if (_device != null)
            {
                if (_device.State != DeviceState.Closed)
                    _device.Close();
            }


            // Fecha a ger??ncia
            if (_deviceManager.State != DeviceManagerState.Closed)
                _deviceManager.Close();
        }

        /// Fecha o dispositivo

        private void CloseDevice()
        {
            // Desabilita o servi??o
            if (_device.State == DeviceState.Enabled)
            {
                if (!_device.ShowUI)
                    _device.Disable();
            }


            // Fecha
            if (_device.State == DeviceState.Opened)
                _device.Close();
        }

        /// Ao fechar o formul??rio, libera o uso

        private void Scan_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (_device != null)
            {
                // Verifica se est?? em uso
                if (_device.State == DeviceState.Transferring ||
                    _device.State == DeviceState.TransferReady)
                {
                    // Envia a solicita????o de cancelamento
                    _device.CancelTransfer();
                    // Aguarda finalizar
                    e.Cancel = true;
                    MessageBox.Show(“O dispositivo est?? em uso! Aguarde alguns instantes enquanto ?? solicitado a libera????o do scanner.”, “Informa????o”);
                    return;
                }
            }


            // Fecha o dispositivo e a ger??ncia
            CloseDeviceAndDeviceManager();
        }

Pronto! O scaneamento ?? realizado e ?? gerado um arquivo JPG. Reparem que est?? comentado o atributo _device.FileFormat porque nem todo scanner d?? a possibilidade de configura????o. Alguns aceitam e outros n??o. Se utilizar alguma configura????o que o scanner n??o suporta, deve aparecer a mensagem: “Failed to get/get to capability”. Ent??o voc?? precisa deixar apenas as configura????es que o scanner suporte.
Bons scans!

Categorias
componentes crop handler imagem thumbnail

Recortando uma Imagem em Tempo de Execu????o (Image Crop) em C#

Lembram do post de Redimensionar Imagem? Esse post ser?? bem similar e explicarei em poucas palavras o que ele faz. O que ?? Crop? Segundo a WikipediaCrop (Recorte) refere-se ?? remo????o da parte exterior de uma imagem para melhorar o seu enquadramento. Um exemplo mais entend??vel: temos uma galeria de fotos nas quais todas as imagens possuem largura e altura diferentes que n??o s??o proporcionais; o redimensionamento de imagem para gerar um thumb n??o ir?? funcionar pois o produto final ou ficar?? distorcido ou n??o ficar??o com tamanhos iguais. ?? a?? que o recorte entra…

Veja o exemplo abaixo (retirado da Wikipedia):
  • Imagem recortada
  •  

  • Imagem original
No caso em quest??o era desejado obter um thumb quadrado da imagem. O enquadramento desejado n??o ?? proporcional ?? image original, logo ?? feito o recorte.
Dessa vez n??o irei colocar o c??digo pois ?? um pouco grandinho, mas, como disse, ?? bem similar ao c??digo do post de Redimensionar Imagem bem como seu uso (em forma de handler.ashx). Esse c??digo ?? bem velhinho e n??o ?? meu. Ele est?? a?? na net a muito tempo e j?? o vi em v??rios blogs e artigos. A ??ltima vez que o vi estava no subversion de Assembla.
Logo, baixem aqui e usem-o como desejar.
Categorias
ajax dicas javascript

Usando o ScripManager em sequ??ncia

Esse artigo ser?? apenas uma dica para os desatentos. Quando voc?? usa o ScriptManager para exibir um alerta, por exemplo, e em outro trecho do c??digo fazer a mesma coisa, ver?? que apenas o primeiro alerta ?? demonstrado e o segundo n??o. O porqu?? disso ?? se estiver reaproveitando o mesmo script e n??o diferenciar o bloco de execu????o dele, sempre ser?? exibido apenas o primeiro. Logo, o certo, ?? ter algo do tipo:

// Exibe o primeiro alerta
ScriptManager.RegisterStartupScript(Page, typeof(Page), “script1”, “alert(‘Alerta 1’);”, true);




// Exibe o segundo alerta
ScriptManager.RegisterStartupScript(Page, typeof(Page), “script2”, “alert(‘Alerta 2’);”, true);

Reparou no bloco script1 e script2? ?? isso.

Categorias
api hotspot html integra????o ip linux mikrotik rede ssl tcp windows

Adicionando uma p??gina de cadastro de usu??rios (Hotspot) em ASP.NET no Mikrotik

Cada projeto que pego, ?? uma aventura nova a ser encarada! Dessa vez me adentrei no universo de Linux, rede, SSH, infra e tudo o que ?? direito. Quem n??o conhece, a Mikrotik ?? uma empresa de grande refer??ncia no que tange em equipamentos para redes de computadores. Seu principal destaque ?? o RouterOS que ?? sistema operacional que torna o roteador um poderoso gerente de rede. Dentro do Mikrotik (irei me referenciar sempre dessa forma generalizando como um produto), h?? o HotSpot. Com ele pode-se gerenciar quem ir?? autenticar na rede para usar a internet (ou apenas a intranet), banda usada, taxa de transfer??ncia e outras funcionalidades por usu??rio ou de forma geral. Um exemplo de uso desse sistema ?? de quando voc?? vai a uma rede corporativa onde precisa autenticar-se para usar a internet… ?? isso!

Qual ?? o objetivo desse artigo ent??o? A princ??pio ?? apenas obter as p??ginas originais de hotspot do Mikrotik, colocar um redirecionador para uma p??gina externa, criar uma p??gina externa de cadastro de usu??rio (para que possa acessar a rede) e fazer funcionar. N??o ensinarei como configurar ou criar o hotspot. Pela net h?? v??rios tutoriais muito bons sobre o assunto e tamb??m n??o ?? de minha ??rea. Recomendo fortemente o f??rum da Under-Linux que l?? o pessoal manja muito no assunto.

Nesse artigo usei o Mikrotik MKBR100 que ?? bem f??cil de usar: basta plugar o cabo de rede da internet, do servidor e da energia. Pronto!

Para acessar seu SO, deve-se utilizar o Winbox como se fosse um daqueles players de m??quina virtual ou OpenSSH. Vamos l?? colocar a m??o na massa!

Conecte o cabo de rede de seu PC (ou servidor) na porta (interface) ether2 do Mikrotik. Agora conecte outro cabo na ether1 para os outros computadores da rede (ou roteador simples). Porqu?? na ether1? Estou considerando que o hotspot est?? configurado para monitorar essa interface enquanto a ether2 ser?? utilizado para que o servidor de comunique com o aparelho. Seria algo do tipo:

V?? em IP > Address no Mikrotik para que sejam configuradas as interfaces e sejam endere??ados conforme os exemplos abaixo:

  • ether1: 192.168.88.1
  • ether2: 192.168.88.2

Somente atrav??s de IP que ser?? poss??vel enviar os arquivos do hotspot. Se ficar conectando, via MAC, pelo Winbox, voc?? ter?? a mensagem de erro: “router has been disconnected” (logo, conecte-se usando a ether2 – 192.168.88.2). E outra coisa ??: se n??o seguir o esquema acima, outros erros voc?? ter??, como:

could not connect to … no response
could not connect to … connection refused

could not connect to … network is unreachable
could not fetch index from … not found

Tudo isso por causa de configura????o apenas! ?? bom deixar o IP do servidor fixo para que possa dar permiss??o de porta, firewall, etc. No caso deixei como 192.168.88.30 (que no caso era minha pr??pria m??quina). Uma dica: ??s vezes d?? um reboot no aparelho!

O pr??ximo passo ?? ativar a porta da API que o Mikrotik disp??e para integra????o com linguagens de programa????o. ?? atrav??s dela que iremos conectar e fazer a comunica????o. S?? que precisamos ativ??-la. V?? em IP > Services e ative a API na porta 8728.

Tamb??m libere, no Firewall, as portas para conex??o tanto do sistema quanto do Winbox (pelo IP), sen??o quando estiver acessando pela p??gina de cadastro, ir?? surgir o erro: “nenhuma conex??o p??de ser feita porque a m??quina de destino as recusou ativamente ..:8728.”.

Para permitir a navega????o e envio de informa????es, adicione as permiss??es no Walled Garden.

Vejam que at?? o momento tudo ?? configura????o e nada de programa????o. Continuemos…

Agora vamos em Files e selecione todos os arquivos da pasta hotspot, arraste para sua ??rea de trabalho que ser?? copiado. Para enviar fa??a o processo inverso… Se estiver acessando pelo IP vai dar certo, sen??o cair?? a conex??o (lembra que disse acima?).

Abra o HTML da p??gina login.html e acione um link para a p??gina de cadastro que ficar?? hospedada no servidor. Adicionei o link <a href=“http://192.168.88.30/mikrotik/cadastro.aspx”>cadastre-se</a> . Customize as demais p??ginas como desejar e as envie de volta. Praticamente terminamos de trabalhar no Mikrotik.

Agora vem o mais simples: criar a p??gina ASP.NET. Voc?? pode utilizar qualquer linguagem de programa????o que possa usar TCP na comunica????o e que a API suporte: PHP, Delphi, C, C++, C#, Flash, Ruby on Rails, Java, Python, VB.NET, etc.

Fa??a o download da classe MK, em C# (eles j?? disp??e de classes prontas para outras linguagens tamb??m), nesse link aqui e adicione no seu projeto. Agora crie um Web Form adicionando os campos que queira trabalhar. No meu exemplo, s?? quis login (username) e senha. Adicione um Button e um m??todo para executar o cadastro do usu??rio conforme exemplo abaixo:

             // Autentica????o
            MK mikrotik = new MK(“192.168.88.2”);
            if (!mikrotik.Login(“admin”, “”))
            {
                ScriptManager.RegisterStartupScript(Page, typeof(Page), “alert”, “alert(‘Houve um problema de comunica????o com o Hotspot! Por favor, tente mais tarde.’);”, true);
                mikrotik.Close();
                return;
            }

            // Requisi????o
            mikrotik.Send(“/ip/hotspot/user/add”);
            mikrotik.Send(“=name=” + nome.Text);
            mikrotik.Send(“=password=” + senha.Text, true);

            //Retorno
            string retorno = string.Empty;
            foreach (string h in mikrotik.Read())
            {
                if (retorno != string.Empty)
                    retorno += “, “;
                retorno += h;
            }

            // Fecha objeto
            mikrotik.Close();

            // Valida????o
            if (retorno.ToLower().Contains(“!done=ret=”))
                ScriptManager.RegisterStartupScript(Page, typeof(Page), “alert”, “alert(‘Cadastro realizado com sucesso!’); location.href=’http://192.168.88.1/login.html’;”, true);
            else if (retorno.ToLower().Contains(“message=failure: already have user with this name for this server”))
                ScriptManager.RegisterStartupScript(Page, typeof(Page), “alert”, “alert(‘J?? existe um usu??rio com esse nome!’);”, true);
            else
                ScriptManager.RegisterStartupScript(Page, typeof(Page), “alert”, “alert(‘Falha no cadastro: “ + retorno + “!’);”, true);

Voc?? poderia n??o s?? fazer o cadastro de usu??rio no hotspot como tamb??m executar qualquer comando (SSH) no Mikrotik. Lembrando que eu atropelei muita coisa a?? no que diz respeito a configura????o do dispositivo na qual disse logo no in??cio que n??o era minha finalidade. Voc??s observaram que a parte de programa????o ?? bem simples do que configura????o… e com certeza ??! Agora nunca ir?? sair de minha cabe??a a palavra Mikrotik Mikrotik Mikrotik Mikrotik Mikrotik … Por favor, qualquer erro ou informa????o adicional me avise!

[]’s

UPDATE: disponibilizei uma implementa????o no post http://thiagomarcal.blogspot.com.br/2016/09/implementacao-do-aspnet-c-com-o.html