segunda-feira, 31 de agosto de 2009

Session Transfer

Bom Galera,
Um tempo atrás tive de desenvolver uma aplicação híbrida, que integrava o velho ASP com .NET2.0, porém como todos sabem, estas tecnologias não compartilham as sessions, e então? como fazer o .net ler as sessions do asp?
Pra resolver isto tive de apelar para uma metodologia que usa banco de dados, vou explicar tudo, passo-a-passo logo, mas antes irei apresentar algumas características deste projeto para que vocês entendam as limitações que a solução deveria respeitar.1º. O projeto se trata de um sistema modular feito em ASP.
2º. Os módulos novos deveriam, mandatoriamente, sem feitos em .net VB 2.0
3º. O banco deve seguir a arquitetura posta no projeto inicial, que é MS-SQL 2000
Depois destas noticias desanimadoras, vamo à solução.
Devo criar uma tabela no banco de dados com a seguinte modelagem:
O Script para a criação da tabela é:
CREATE TABLE [dbo].[SessionTransfer] (
[IdSecao] [varchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Chave] [varchar] (100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Valor] [text] COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[Data] [datetime] NOT NULL 
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[SessionTransfer] ADD 
CONSTRAINT [DF_SessionTransfer_Data] DEFAULT (getdate()) FOR [Data]
GO


Vamos para os codigos em ASP e .NET:
Após o sistema principal em ASP fazer a criação das sessions que o projeto precisa, tais como permissões de acesso, regras de hierarquia, etc, eu chamo o arquivo "sessiontransfer.asp".
ATENÇÃO:
O código demonstrados neste post são apenas didáticos e não devem ser utilizados da forma como são apresentados, pois possuem diversas falhas de segurança como SQL-Injection por exemplo. Caso você queira utilizá-lo, apenas baseie sua lógica neste exemplo, mas construa um código seguindo as condutas de boas práticas.

< ! - - #include file="../_include/_abreconexao.asp"  - -  >
< %
For i = 1 to (Session.Contents.Count -1)
strSql = "INSERT INTO SessionTransfer (IdSecao, Chave, Valor) VALUES ('" &
strSql = strSql & Session.SessionID & "', '" & Session.Contents.Key(i) & "', '" & Session.Contents.Item(i) & "')"
DBCon.Execute (strSql)
Next
Response.Redirect("SessionTransfer.aspx?IdSecao=" & Session.SessionID)
% >

Como vocês percebem, este código varre todas as chaves de sessions da aplicação e as envia para o banco. Após este processo ele redireciona para o arquivo em .NET "SessionTransfer.aspx", com a devida parametrização de identificação da Session.
Segue o código do "SessionTransfer.aspx":
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Collections
Imports System.Web
Imports System.Web.Security
Imports System.Web.UI
Imports System.Web.UI.WebControls
Imports System.Web.UI.WebControls.WebParts
Imports System.Web.UI.HtmlControls

Partial Public Class SessionTransfer
Inherits System.Web.UI.Page
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim objConn As SqlConnection = New SqlConnection(SqlHelper.m_strConn)
Dim objCmd As SqlCommand = New SqlCommand()
Dim objAdap As SqlDataAdapter = New SqlDataAdapter()
Dim objDataSet As DataSet = New DataSet()
Dim strIdSecao As String = Request.QueryString("IdSecao").ToString()
Dim i As Integer = 0
objConn.Open()
objCmd.CommandTimeout = 300
objCmd.CommandType = CommandType.Text
objCmd.Connection = objConn
objCmd.CommandText = "SELECT Chave, Valor FROM SessionTransfer WHERE IdSecao = '" + strIdSecao + "'"
objAdap.SelectCommand = objCmd
objAdap.Fill(objDataSet)
For i = 0 To objDataSet.Tables(0).Rows.Count - 1
If (Session(objDataSet.Tables(0).Rows(i)("Chave").ToString()) <> Nothing) Then
Session.Remove(objDataSet.Tables(0).Rows(i)("Chave").ToString())
End If
Session.Add(objDataSet.Tables(0).Rows(i)("Chave").ToString(), objDataSet.Tables(0).Rows(i)("Valor").ToString())
Response.Write(objDataSet.Tables(0).Rows(i)("Chave").ToString())
Response.Write(objDataSet.Tables(0).Rows(i)("Valor").ToString())
Next
        objCmd.CommandText = "DELETE FROM SessionTransfer WHERE IdSecao = " + strIdSecao
        objCmd.ExecuteNonQuery()
        objCmd.CommandText = "DELETE FROM SessionTransfer WHERE DATEDIFF(hh, Data, GETDATE()) >= 1"
        objCmd.ExecuteNonQuery()
End Sub
End Class

Neste arquivo eu recupero os valores baseado na SessionID passada por parâmetro, crio as Sessions para o .NET e após eu deleto do banco todas as chaves da session que busquei.
Notem que também faço uma segunda exclusão procurando por sessions cadastradas com mais de 1 dia.

Para exemplo isso serve, mas lembrem-se de que isso é só um exemplo!!! muito cuidado ao usarem querys SQL que são concatenadas com parâmetros query-string! Ainda mais sem tratamento como o do exemplo.
Na realidade, meu conselho é: Nunca façam isso! =D Mas para didática isso já ajuda banstante.

abraços!

quinta-feira, 27 de agosto de 2009

Rumo ao MCPD

Há muito tempo que eu não posto nada no meu blog, mas vou reiniciar este processo.

Começo com uma novidade, acabo de entrar em um desafio onde meus colegas de trabalho Rafael Ribas e Luis Eduardo e eu iremos entrar em uma odisséia de estudos para buscarmos nossa certificação MCPD.

Lançamos um blog(rumoaomcpd.blogspot.com) que será nosso diário de bordo, onde postaremos nossas impressões sobre os conteúdos das provas necessárias para a certificação MCTS e depois a MCPD.

Visitem e acompanhem este desafio!

terça-feira, 21 de outubro de 2008

problemas de debug no VS2005

pois é gente,
passei por um aperto estes dias, mas consegui achar o problema.

eis que quando eu ia debugar um projeto que estou tocando aqui aparecia o seguinte alert:

---------------------------
Microsoft Visual Studio
---------------------------
The following module was built either with optimizations enabled or without debug information:

c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\d33c2b62\ba11b592\assembly\dl3\7153188f\fbed248c_8933c901\BookEngine.DLL

To debug this module, change its project build configuration to Debug mode. To suppress this message, disable the 'Warn if no user code on launch' debugger option.
---------------------------
OK
---------------------------

pois finalmente descobri o que é e como resolver.

o fato é que dentro da minha solution eu possuo dois projetos, o WebSite e o BookEngine.
o BookEngine é apenas uma série de classes que eu importo no WebSite e utilizo ele instanciando meus objetos.

Para fazer o relacionamento eu apenas adicionei uma referência diretamente na DLL do outro projeto, e por isso dava errado.

O erro acontece pois na hora de compilar, a DLL do BookEngine não estava sendo atualizada no bin do projeto.

Para solucionar eu apenas excluí a relação e em references eu utilizei a aba de projetos, relacionei o projeto do BookEngine e pronto!

Tudo funcionando perfeitamente e sem problemas de debug.


Eras isso,
qualquer duvida só me enviar um mail.

ab.

sábado, 6 de setembro de 2008

O Chrome não quer dizer muita coisa

Li este post no blog http://www.tableless.com.br/ e achei muito interessante, pois concordo em 100% com o que foi dito pelo Diego Eis, e acho muita fumaça pra pouco fogo.... enfim... segue abaixo o texto.



O Google lançou sua presença no mercado de browsers. Atitude interessante mas que para mim não quer dizer muita coisa. Ter um novo browser não muda muito (a minha) a vida dos desenvolvedores. Lembre-se que não importa quão bom seja o Firefox, Safari ou o Google Chrome, nós, desenvolvedores temos sempre que nivelar tudo por baixo, pelo Internet Explorer 6. Se o Chrome ou qualquer outro novo navegador ajudar com que o IE6 seja definitivamente descontinuado, eles serão bem-vindos. Caso contrário, o lançamento de bons browsers só vai, por assim dizer, brochar a vontade dos profissionais que querem utilizar recursos mais avançados do CSS mas não podem por conta do IE6. O IE7 foi um avanço interessante. O IE8 está pretendendo ser. Mas até mesmo o IE8 não vai ser muito útil enquanto ele não tomar a o lugar do Internet Explorer 6. O mesmo vale para qualquer outro browser.

Do que adianta eu utilizar PNG transparente para os browsers que suportam canal alpha e ter que continuar recortando imagens para fazer um bom trabalho no IE6? A Microsoft sabe que ela criou um monstro, e ainda bem que ela reconheceu isso e tomou alguma atitude.

Vou ter muito mais prazer de trabalhar quando ouvir a notícia da descontinuação do IE6, do que sobre o lançamento de um novo browser. Por isso eu não fico 100% satisfeito com o Chrome, nem com o Firefox 3, nem com atualizações do motor WebKit. Não porque não quero, mas porque vou continuar tendo o mesmo trabalho que sempre tive para fazer sites.

Vou continuar tendo as mesmas preocupações, vou continuar fazendo as mesmas técnicas manjadas e trabalhosas. O problema continua sendo o passado. É o IE6 que ainda dita as regras.


Fonte: http://www.tableless.com.br/chrome-nao-quer-dizer-muita-coisa

sexta-feira, 9 de maio de 2008

quão nerd você é?

e voce?
quanto nerd você é????
NerdTests.com says I'm an Uber-Dorky Nerd God.  What are you?  Click here!

Lançado a primeira rede social para Hackers!

É isso mesmo galera! Acabaram de lançar o House of Hackers! uma rede social para hackers se encontrarem, formarem grupos, debaterem problemas de segurança, e "Dominar o mundo!!!"

De acordo com o blog do pessoal da GNUCITIZEN, a rede é exclusiva e apoiará questões culturais e o modo de vida Hacker, ideologias, politica e principalmente voltando para o foco nas opiniões sobre a esfera de segurança.

Além de criar grupos, os especialistas da House of Hackers terão chance de prestar serviço a empresas, que poderão recrutar testadores de segurança ou analistas diretamente pela rede social, inserindo em um mural a descrição do trabalho e qualificações necessárias, e podendo ser contatadas diretamente.

Através de taxas aceitas durante a inserção de novas vagas, os responsáveis pela rede social patrocinarão programas de pesquisa que devem ser iniciados em breve, mesmo que o programa esteja em seus estágios iniciais de desenvolvimento.

Alguns "Especialistas em porra nenhuma" acreditam que o site pode ser visto com maus olhos por autoridades, temendo que o fácil acesso a informações possa ser usado para o mal, promovendo invasões, por exemplo. Mas eles não se lembram que é justamente por isso que o ambiente é restrito caramba!!!

Pq ainda temos tanto medo da palavra Hacker??? Somos apenas nerds que curtem sistemas de segurança... não é nossa culpa se não existe nada impossivel de ser quebrado(prefiro esta palavra do que "invadido"). e tem mais... somos nós quem somos contratados pra arrumar as cagadas que os superpoderosos analistas de TI fazem nas redes e deixam a porta aberta pra serem invadidos... então, pq crucificar aqueles que vocês sempre recorrem?????

Bom... desabafo feito, segue ae os links de referência sobre o assunto:

O House of Hackers pode ser acessado em houseofhackers.ning.com.
Link do blog da www.gnucitizen.org falando sobre o assunto.
Noticia do Terra
Noticia do GEEK

sexta-feira, 7 de março de 2008

Alterando a current.Culture no Framework 1.1

foi uma mão fazer esta troca... no framework 2.0 é bem mais facil... mas enfim...
la vai:

você precisa importar 2 namespaces:

Imports System.Globalization
Imports System.Threading


e depois você altera ela assim:

Thread.CurrentThread.CurrentCulture = New CultureInfo("en-US")
Response.Write("Current Culture is " +
Thread.CurrentThread.CurrentCulture.EnglishName)
Thread.CurrentThread.CurrentCulture = New CultureInfo("pt-BR")
Response.Write("Current Culture is " +
Thread.CurrentThread.CurrentCulture.EnglishName)


pra mais informações acesse o post da pagina de suport da micros~1 :
http://support.microsoft.com/kb/306162

e pra ver a lista de codigos das Cultures acesse no MSDN:
http://msdn2.microsoft.com/en-us/library/system.globalization.cultureinfo(vs.71).aspx

é isso ae...
até.