Categorias
dicas php visual studio web-service wsdl

Consumindo Web-Service PHP atrav??s do ASP.NET (C#)

J?? passou por aqui um post sobre de como consumir um web-service, mas era em ASP.NET. Agora como consumir um web-service em PHP? Da mesma forma. N??o muda! O fato de escrever esse post ?? apenas e pelo simples fato de ter um certo inconveniente na elabora????o do web-service em PHP.
Se procurar na net, recomendo o artigo de Maur??cio Reckziegel da iMasters que ?? muito bom e explica certinho como fazer. Se voc?? seguir ?? risca o que est?? escrito ir?? conseguir elaborar um web-service em PHP normalmente e ir?? conseguir consumir, menos em ASP.NET. N??o ?? que a mat??ria esteja errada, ?? porque o ASP.NET ?? chato com a valida????o do WSDL que ?? gerado pelo PHP. O documento (WSDL) tem que ser gerado na m??o e, quando n??o ?? gerado de forma autom??tica, estamos suscept??veis ao erro. Com o web-service em PHP ?? assim…
Ent??o, digamos que voc?? tenha elaborado o web-service em PHP e j?? fez refer??ncia na sua aplica????o. Contudo sua aplica????o pode dar erro ou retornar nada. Primeiramente, todo WSDL que iremos usar deve ser validado antes de ser devidamente consumido. O Visual Studio disp??e de uma ferramenta que valida e gera a classe consumidora (que n??o precisar ser usada pois est?? intr??nseco na ferramenta). V?? em Iniciar > Todos os Programas > Microsoft Visual StudioVisual Studio ToolsVisual Studio 2008 Command Prompt. Ir?? abrir um prompt de comando. Escreva por exemplo: wsdl http://thiagomarcal.blogspot.com/webservice.php?wsdl . Se der tudo certo, ir?? surgir um resultado semelhante a esse:

Se estiver tudo OK, ent??o pode usar tranquilamente, caso contr??rio ir?? surgir o seguinte problema:

Microsoft (R) Web Services Description Language Utility

[Microsoft (R) .NET Framework, Version 2.0.50727.3038]
Copyright (C) Microsoft Corporation. All rights reserved.

Warning: This web reference does not conform to WS-I Basic Profile v1.1.

Ou seja, o WSDL gerado pelo PHP n??o est?? conforme o padr??o. Dando uma alterada aqui e ali, podemos usar o seguinte c??digo para gerarmos o web-service em PHP dentro dos conformes:

<?php
// Requerimento aos componentes
require_once(‘nusoap/nusoap.php’);
include(“class.phpmailer.php”);
include(“class.smtp.php”);


// Cria????o da inst??ncia
$server = new soap_server();


// Registro do m??todo
$server->register(‘EnviaMail’);


// WSDL
$server->configureWSDL(‘server.EnviaMail’,’urn:server.EnviaMail’);
$server->wsdl->schemaTargetNamespace = ‘urn:server.EnviaMail’;
// registra o m??todo a ser oferecido
$server->register(‘EnviaMail’, //nome do m??todo
array(‘email’ => ‘xsd:string’), //par??metros de entrada
array(‘return’ => ‘xsd:string’), //par??metros de sa??da
‘urn:server.EnviaMail’, //namespace
‘urn:server.EnviaMail#EnviaMail’, //soapaction
‘rpc’, //style
‘literal’, //use
‘Retorna se o e-mail foi enviado’ //documenta????o do servi??o
);


// Defini????o do m??todo a ser utilizado
function EnviaMail($email) {
return “E-email enviado com sucesso!”;
}


// Requisi????o para uso do servi??o
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : ;
$server->service($HTTP_RAW_POST_DATA);
?>

Perceberam a diferen??a? Praticamente nenhuma, mas h??: o estilo do documento. N??o irei entrar em detalhes, mas dois tipos de documentos mais usados: encoded e literal (veja mais nesse artigo). Use literal! Com isso seu web-service ser?? consumido certinho…
Se estiver com o erro: O cliente encontrou o tipo conte??do de resposta de ‘ text/html; charset = utf-8 ‘, mas era esperado ‘text/xml’ ou The client find the answer ‘text/html’, but was expected ‘text/xml’. verifique se seu web-service est?? imprimindo conte??do HTML (echo) e comprometendo o retorno dos dados. Tranquilo, n???

Categorias
clr dicas dll sql server visual studio

Utilizando fun????o de uma DLL Externa no SQL Server

Esse ?? um t??pico que ir?? mostrar algo que definitivamente voc?? j?? precisou mas n??o sabia como fazer e que facilitar?? (e muito) alguns trabalhos. Programadores que usam o Bando de Dados para programar sendo por Stored Procedure, Functions e Triggers j?? passaram por maus bocados para preparar um algoritmo que realizasse um determinado processo, mas que esse mesmo algoritmo ?? mais f??cil de ser escrito (ou possuir funcionalidades que o SGDB n??o possui) em outra linguagem de programa????o. Por exemplo: validar e-mail. ?? poss??vel no SQL Server fazermos um Function que receba um VARCHAR e retorne um BIT informando que um e-mail ?? v??lido ou n??o, contudo seria uma fun????o um tanto que trabalhosa para quem n??o est?? familiarizado com programa????o em banco. Para quem desenvolve em ASP.NET (C# ou VB.NET) basta usarmos express??o regular que, em duas linhas, resolve o problema. Portanto iremos utilizar uma fun????o escrita em C# compilada em uma DLL e usarmos em um Function no SQL Server. Isso ?? poss??vel atrav??s do CLR.
Primeiramente vamos criar a DLL contendo a fun????o (no nosso exemplo vamos fazer a que valida e-mail – mas voc?? pode desenvolver a que quiser). Abra o Visual Studio e crie um Project. Em Project Type escolha Visual C# Windows e o Template opte por uma Class Libary. Note que quando voc?? cria uma classe vem com o nome Class1.cs. Para facilitar a compreens??o, renomeie para FuncoesSql.cs (ou outra) e remova o namespace criado. Agora, escreva a fun????o que deseja e adicione os namespaces necess??rios ficando da seguinte forma:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Text;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;

public partial class FuncoesSql
{
    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBoolean IsMailValido(SqlString email)
    {
        // Cria um objeto de express??es regulares para validar e-mail
        Regex expressaoRegular = new Regex(@”^(([^<>()[]\.,;:s@””]+”
        + @”(.[^<>()[]\.,;:s@””]+)*)(“”.+””))@”
        + @”(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}”
        + @”.[0-9]{1,3}])(([a-zA-Z-0-9]+.)+”
        + @”[a-zA-Z]{2,}))$”);

        // Realiza um teste na valida????o da express??o
        return new SqlBoolean(expressaoRegular.IsMatch(email.ToString()));
    }
}

No caso, precisamos explicitar os tipos de entrada e sa??da utilizados pelo banco de dados para que n??o haja problemas de tipagem. Poderia ser qualquer fun????o ou quantas que quisesse, contanto que respeite os tipos. Agora compile a DLL pressionando F6 ou pelo menu Build. J?? temos a DLL com a fun????o. Copie a DLL (que est?? na pasta binDebug de sua solu????o) e coloque-a em um local onde seu Banco de Dados possa busc??-la. Para exemplo, colocarei em C:SqlDlls no Servidor.
O pr??ximo passo ?? verificar se no SQL Server est?? ativo a funcionalidade CLR, para isso v?? em Iniciar > Todos os Programas > Microsft SQL Server 2008 (ou 2005) > Configuration Tools > SQL Server Surface Area Configuration. Entre em Surface Area Configuration for Features e na guia CLR Integration verifique se a fun????o est?? habilitada. Se n??o estiver, habilite.

D?? OK e agora j?? poder?? usar CLR no SQL Server. Abra o SQL Server Management Studio, conecte-se na base desejada e execute as seguintes instru????es SQL (abra um New Query para isso):

— CRIA O ASSEMBLY INDICANDO SUA ORIGEM
CREATE ASSEMBLY FuncoesSql FROM ‘C:SqlDllsFuncoesSqlServerASPNET.dll’
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
— CRIA A FUN????O
CREATE FUNCTION dbo.Fun_Valida_Mail (@email NVARCHAR(350))
RETURNS BIT
— INDICA A ORIGEM DA FUN????O SQL: ASSEMBLY > CLASSE > FUN????O
AS EXTERNAL NAME [FuncoesSql].FuncoesSql.IsMailValido
GO

Agora execute a Query (ou pressione F5)… Foi criada a fun????o! Pronto… agora ?? s?? usar como se fosse uam fun????o do SQL Server normalmente. Abaixo tem alguns exemplos de consulta e seus retornos:

Execu????es:
SELECT dbo.Fun_Valida_Mail(‘tmarcal@gmail’)
SELECT dbo.Fun_Valida_Mail(‘tmarcal@gmail.com’)
SELECT dbo.Fun_Valida_Mail(‘tmarcal.. @gmail.com’)
 
Retorno:
0
1
0
 
Apesar do trabalho inicial, pode-se aproveitar muito de ambos os recursos e criar cada vez mais fun????es complexas. Quanto ao desempenho da CLR, em compara????o ao T-SQL, deve-se ficar a mesma coisa. A diferen??a ?? praticamente impercept??vel. Espero que tenham gostado… At?? breve!

Categorias
chat javascript visual studio

Criando um Chat em ASP.NET em 1 minuto

Para quem quer ter um chat em seu web site, esse componente ?? uma m??o na roda. Muito f??cil de ser utilizado e configurado, apesar de seus bugs (irei solucion??-los no fim do post). Em poucos segundos voc?? tem um chat funcional! A Web Furbish desenvolveu esse componente e pode ser encontrado tanto aqui quanto aqui e em v??rios mirros pela net. Vamos ao desenvolvimento…
Extraia os arquivos em um local onde poder?? busc??-los. Agora crie um novo Web Site. Se for sua primeira vez usando o componente, primeiramente, deve-se adicionar o novo controle ao ToolBox do Visual Studio. Para isso, clique com o bot??o direito em algum local onde ?? exibido os itens e escolha a op????o Choose Items:

Quando surgir a caixa de sele????o de componentes, na aba .NET Framework Components, clique no bot??o Browse… para selecionar a DLL JaxterChat.dll na pasta onde extraiu os arquivos a princ??pio. Clique em OK para carreg??-la. Ver?? que ela foi adicionada ao ToolBox. Esse passo foi o mais dif??cil! Em seguida copie a pasta JaxterChat (que havia junto ?? DLL) e incorpore-o a seu projeto. Nessa pasta cont??m arquivos de imagem, som, etc. Agora ?? simples: arraste-o para a p??gina para que ele seja adicionado. Pronto! Voc?? j?? tem seu chat
O resto ?? apenas configura????o: tema, tempo de atualiza????o, usar som, nome dos labels, etc. Veja como ficou o meu!

Tranquilo e pr??tico, n??o? Antes dos bugs, vamos a alguns questionamentos?

1) Como fa??o para ter v??rias salas?

Voc?? n??o precisar criar v??rias p??ginas para a cada sala. Basta que, no Page_Load, atribua o nome da sala ao controle. Exemplo: Chat.RoomName = “Blog”; O controle ir?? se encarregar de fazer a separa????o dos usu??rios de acordo com o nome da sala.

2) Como gravar o log das conversas?

Crie um m??todo para o OnMessagePosted do chat. Voc?? pode gravar em banco ou em arquivo. Ficaria mais ou menos assim:

protected void Grava_Log(object sender, WebFurbish.JaxterMessageEventArgs e)
{
      string sala = e.RoomName;
      string usuario = e.UserName;
      string mensagemExibida = e.Message;
      string mensagemHtml = e.MessageHTML;
      string hora = DateTime.Now.ToString(“dd/MM/yyyy HH:mm:ss”);
      // Grava o log em banco ou em arquivo
}
 
3) Como enviar mensagens ??s salas (avisos de administra????o, etc) igual a um Broadcast?
 
Esse ?? um pouco mais complicado e demorado, ent??o irei explicar em linhas gerais como seria:

  • Pegaria todas as sala usando o m??todo GetRoomList();
  • E para cada sala faz-se o envio atrav??s do m??todo SendCustomMessage().

Um exemplo seria: Chat.SendCustomMessage(“Nova not??cia no blog!”, “Administra????o”, “Blog”, false);
O par??metro false indica que essa mensagem n??o ser?? processada em log (ou seja, n??o parass?? pelo m??todo do OnMessagePosted).
 
E n formas que h?? de customizar o chat para trabalhar da forma como desejar. Pois bem, agora vamos aos bugs encontrados. Quando levantei esses bugs enviei um e-mail para eles mas n??o obtive resposta at?? o momento (tamb??m nem tentei mais… :P).

Bug 1: A cada mensagem entrada, a barra de rolagem ao inv??s de acompanhar as mensagens, ela fica sempre apontada para o topo. Ou seja, ela n??o desce…

Notamos isso quando come??a a encher de mensagens. A barra ao inv??s de rolar automaticamente para baixo, fica estagnada no topo. Analisando o JavaScript que ele gera, verifiquei que h?? um problema na fun????o WF_goToBottomScroll. Da??, como n??o posso apagar ela, criei uma outra com o mesmo nome. Como h?? sobrecarga ela ser?? executada tamb??m. ?? armengue, mas ?? uma solu????o. Como funciona essa solu????o? A cada 0 segundos verifico se o foco est?? no campo de texto digitado: se estiver, a barra da div rola automaticamente para baixo. Para que isso funcione, baixe esse script aqui para fazer uma varredura de controles HTML. E adicione o seguinte bloco de c??digo JS na p??gina que cont??m o chat:

window.onload = function() {
    setFocusTracking();
    sizeMsgOut = document.getElementById(‘WF_msgOut’).scrollHeight;
    setTimeout(“WF_goToBottomScroll(‘WF_msgOut’);”, 0);
}


function WF_goToBottomScroll(elemento) {
    var msgOut = document.getElementById(elemento);
    if (document.hasFocus) {
        if (document.hasFocus.id == ‘WF_textInput’)
            msgOut.scrollTop = msgOut.scrollHeight;
    }
    setTimeout(“WF_goToBottomScroll(‘” + elemento + “‘);”, 0);
}

Bug 2: O som n??o funciona!

Quando vi que iria ter som, pensei: “Bala!”. Mas da?? ele exige Java para rodar. Pensei novamente: “Tranquilo! Hoje na net, em sites de banco, tem que ter Java, logo pro chat vai ser pr??-requisito ter tamb??m.”. Instalei a vers??o mais recente e n??o funcionou! Porque, eu n??o sei. Como o componente ?? fechado, a ??nica coisa que deu para ver ?? que ele chama uma classe Java SoundApplet.class j?? compilada. Enfim, providenciei outra solu????o: coloquei a propriedade EnableSound como false e adicionei algumas linhas ao script WF_goToBottomScroll para tocar um som a cada vez que ?? dado uma entrada de mensagem. Esse som ?? puro JavaScript! Primeiro, adicione uma tag de som em background em qualquer local da p??gina, assim:

<BGSOUND id=“sound” src=“”>

Depois crie uma vari??vel global var sizeMsgOut = 0; antes do window.onload . Ou seja, estou criando uma vari??vel global que ir?? armazenar o tamanho de minha div a cada momento e quando entrar na p??gina pela primeira vez ter?? valor 0. Agora, adicione as linhas abaixo na fun????o WF_goToBottomScroll antes do setTimeout:
if (document.getElementById(‘WF_msgOut’).scrollHeight != sizeMsgOut) {
    document.all.sound.src = “JaxterChat/Sounds/alert.au”;
    sizeMsgOut = document.getElementById(‘WF_msgOut’).scrollHeight;
}

A cada itera????o da fun????o, verifico se o tamanho da div que cont??m as mensagens ?? diferente do valor armazenado na vari??vel. Se for ?? porque entrou nova mensagem logo deve tocar o som.

Esses foram dois bugs que encontrei quando estava usando-o. Pode ser que haja outros que n??o encontrei. Se n??o tiver ?? bom, pois ?? um chat bem legalzinho e f??cil e manipular. At?? mais!

Categorias
crash dicas visual studio

“Crash” nos Templates do Visual Studio – Parte 2

Quem leu o primeiro post do “Crash” de Templates do Visual Studio deve ter visto que esse n??o foi o erro que aconteceu comigo (voc?? que est?? lendo, digo)… Outro erro tem assombrado programadores quando ?? emitido uma mensagem como essa:

“Package ‘Visual Web Developer HTML Source Editor Package’ has failed to load properly ( GUID = {BFCC0C3C-6F87-4285-A6C8-BB616061800D} ). Please contact package vendor for assistance. Application restart is recommended, due to possible environment corruption. Would you like to disable loading this package in the future? You may use ‘devenv /resetskippkgs’ to re-enable package loading.”

Essa e suas variantes ficam informando esse erro e pedindo para executar o comando devenv /resetskippkgs para reabilitar os pacotes de volta. Muito bem, eu j?? havia ensinado em um post anterior como realizar a execu????o desse tipo de comando. Mas supondo que voc?? executou o procedimento, abre de novo o Visual Studio e o erro persiste… e agora?
 
Bem, provavelmente voc?? ir?? fazer algumas das sugest??es recomendadas anteriormente, contudo descobri o seguinte: algumas instala????es fazem com que a linguagem do Visual Studio fique em portugu??s (perceba se a aplica????o est?? com o menu ou partes em portugu??s), por exemplo, quando feito a instala????o de algum Add-on, e faz com que aconte??a esse tipo de crash.
 
O Visual Studio n??o trabalha bem com outro tipo de linguagem a n??o ser o ingl??s devido a variantes que ele possui bem como o funcionamento dos controle e reconhecimento do parse da linguagem. Ent??o, devemos colocar o Visual Studio de volta para a linguagem padr??o e para isso realize os seguintes passos:

  1. Abra o Visual Studio;
  2. Entre em Tools e em seguida escolha Options;
  3. Caso todas as op????es n??o estejam sendo exibidas, clique em “Show all settings”;
  4. Em Environment e escolha o item International Settings;
  5. Selecione a linguagem Ingl??s (English) e clique em OK;
  6. Feche o Visual Studio;
  7. Execute o comando devenv /resetskippkgs conforme explicado anteriormente.

Com isso, o problema j?? estar?? corrigido. Ai voc?? diz: “Mas as op????es voc?? escreveu em Ingl??s? E no meu aparece em Portugu??s…”. Mais f??cil do que isso ?? imposs??vel! Google est?? a?? pra isso… Boa sorte!

Categorias
crash dicas template visual studio

“Crash” nos Templates do Visual Studio

Ontem, quando estava instalando um componente no Visual Studio, tudo funcionava normalmente como um dia qualquer. N??o me esperava o Visual Studio falhar na hora que mais precisava dele. Ao trabalhar em um projeto e adicionar um novo item, todos os templates sumiram!!! N??o podia selecionar nenhum template (??bvio que n??o poderia criar mais nada) e ao mesmo tempo surgia-se um erro bizarro informando para que eu entrasse no visualizador de eventos para obter com mais detalhes.

Chegando l?? aparecia um erro informando que houve uma falha no carregamento dos templates e que era para executar o comando abaixo para fazer uma recupera????o dos templates:

devenv.exe /installvstemplates

Para executar o comando, v?? em Iniciar, depois em Programas escolha a pasta do Microsoft Visual Studio 2008/2005, depois na Visual Studio Tools e clique no prompt Visual Studio 2008/2005 Command Prompt. Entre com o comando descrito acima e d?? Enter. Aparentemente o comando ?? executado sem problemas e rapidamente. S?? que tem uma coisa: volte a abrir o Visualizador de Eventos (para quem n??o sabe o Visualizador de Eventos encontra-se no Painel de Controle – Ferramentas Administrativas) e monitore os eventos que est??o sendo gerados. Espere um instante e veja se nenhuma entrada foi gerada. Se der tudo certo, no m??ximo, ir?? surgir alguns warnings no log mas que pouco afeta a restaura????o.

E, por mais que queremos, uma coisa nunca funciona na primeira vez. Logo que executei apareceu in??meros erros (nem eram warnings). Abri o Visual Studio e continuava a mesma coisa. Li alguns materiais na Internet e notei que algumas pessoas j?? se depararam com esse problema. Encontrei v??rios m??todos para lidar com a situa????o, mas pensei melhor e fiquei com receio de piorar o que j?? estava estragado. Ent??o fiz o que todo brasileiro gosta de fazer: tentar de novo! Executei o mesmo processo e funcionou! Aparentemente estava tudo de volta…

Obs: Feche todas as inst??ncias do Visual Studio sen??o n??o funciona corretamente.

Para quem tiver essa sorte, verifique se est?? tudo nos conformes. Quem n??o conseguiu recomendo fortemente reinstalar o Visual Studio novamente. Sen??o, tente alguns dos tutoriais espalhados pela net. Alguns procedimentos como os descritos abaixo podem ajudar caso n??o resolva baseando-se nos m??todos acima:

  1. Mudar o diret??rio dos templates na configura????o do Visual Studio;
  2. Verifique se os templates necess??rios existem na pasta “C:Program FilesMicrosoft Visual Studio 9Common7IDEProjectTemplates” e “ItemTemplates”

Outra solu????o dr??stica ?? fazer a restaura????o do sistema para um ponto onde estava funcionando corretamente a aplica????o. Boa sorte!