Newsgroup: it.comp.lang.visual-basic
Titolo: Vb.net ASP.net UrlRewriting

Non essendoci più un ng di asp.net...sono orfano...e volendo fare in 
VB.net...credo (forzatamente) di essere IT
 
VS2010 Progetto Applicazione web forzatamente FW3.5  (dovrebbe girare 
su aruba)
ho una pagina aspx che contene un link (proprio generato con un literal 
control e via di html)
costruito con
 Dim paginaRewriting As String = Request.ApplicationPath + 
"Contenuti/contenuti.aspx?id=" + riga("idcontenuto").ToString
 
Quindi ho una cartella ~/Contenuti/ che contiene la pagina 
contenuti.aspx
 
il classico link contenuti/contenuti.aspx?id=123
 
ho un database che contiene anche Titolo
Vorrrei che
contenuti/contenuti.aspx?id=123
diventasse
contenuti/pippo-pluto-va-al-mercato.aspx
ma mi accontento anche di
contenuti/pippo-pluto-va-al-mercato/default.aspx
 
Leggo...leggo...leggo...son 2 giorni che leggo e non ci capisco una 
mazza!
 
Scelgo l'httphandler per ora ..sembra facile a leggerlo! Peccato non mi 
faccia nulla!
Parto con l'esempio scolastico (mannaggia in C#) di 
html.it
 
Public Class urlRewriting
    Implements IHttpHandlerFactory
 
    Public Function GetHandler(context As System.Web.HttpContext, 
requestType As String, url As String, pathTranslated As String) As 
System.Web.IHttpHandler Implements 
System.Web.IHttpHandlerFactory.GetHandler
        context.Items("filename") = 
Path.GetFileNameWithoutExtension(url).ToLower
        Return PageParser.GetCompiledPageInstance(url, 
context.Server.MapPath("contenuti.aspx"), context)
....e nulla d'altro
compilo...copio in bin e referenzio...
poi in web.config
      <!--Custom handler per fare url rewriting-->
        <add verb="*" path ="~/Contenuti/*.aspx" type 
="urlRedirect.urlTest,urlRedirect" />
 
Compilo....nessun errore....c'ho dovuto provare 2 3 volte perchè non mi 
ricordavo i namespace di default in VB.net a rompere le palle !
 
Poi mi faccio la pagina di test come dice 
html.it
 
 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles Me.Load
        Dim Pagina As String
        Pagina = Me.Context.Items("fileName").ToString
        Response.Write("Pippo e pluto " + Pagina)
 ...e null'altro
 
BLINK ERRORE
oggetto inesistente su me.context("filename")
 
....che palle....non ci capisco nulla....nemmeno un esempio sega mi 
funziona!...ndo scazzo porca la cippina????
 
 
 
-- 
----- Italliaaaaa 3227! -----
Era Cecco, il figlio del fornaio; era un orribile butterato napoletano, 
col culo molto basso ed un alito agghiacciante tipo fogna di Calcutta.
(Fantozzi)
 
 

 Non essendoci più un ng di asp.net...sono orfano...e volendo fare in 
ho modificato un po di cose...ho cercato di fare tutto ex novo
 
la dll
Imports System.Web
Imports System.Web.UI
Imports System.Globalization
Imports System.IO
 
Public Class urlRewriting
    Implements IHttpHandlerFactory
 
    Public Function GetHandler(context As System.Web.HttpContext, 
requestType As String, url As String, pathTranslated As String) As 
System.Web.IHttpHandler Implements 
System.Web.IHttpHandlerFactory.GetHandler
        context.Items("filename") = 
Path.GetFileNameWithoutExtension(url).ToLower
        context.Items.Add("scemo", "BLLLLLEEEEEEEAH")
        context.RewritePath("fancu/fanculday/contenuti.aspx")
        Return PageParser.GetCompiledPageInstance(url, 
context.Server.MapPath("\Contenuti\contenuti.aspx"), context)
....
Ho provato a settare un items strano...e fare un rewritepath 
assurdo...almeno mi accorgo al volo!
Compilato...e referenziato
e modificato web.config
      <!--Custom handler per fare url rewriting-->
        <add verb="*" path ="~/Contenuti/*.aspx" type =" 
MartekUrlRewriting.urlRewriting, MartekUrlRewriting" />
 
poi ho costruito 2 pagine identiche nalla cartelal contenuti una 
chiamata default.aspx ed una contenuti.aspx
dentro c'ho scritto (ad esempio in contenuti.aspx)
<%@ Page Language="vb" AutoEventWireup="false" 
CodeBehind="contenuti.aspx.vb" Inherits="webmartek.risolveurl" %>
 
e...
 
Public Class risolveurl
    Inherits 
System.Web.UI.Page
 
 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As 
System.EventArgs) Handles Me.Load
 
        For Each chiave As String In Me.Context.Items.Keys
            Response.Write("Chiave " + chiave)
            Response.Write(" Valore: " + 
Me.Context.Items(chiave).ToString)
            Response.Write("<br />")
        Next
.....
 
 
la pagina di test ha url 
http://localhost:1457/WebForm2.aspx
 
e contiene un
http://localhost:1457/Contenuti/contenuti.aspx?id=8
 
 
 
compilo e scateno tutto
PRRRRRRRRRRRRRRRRRRRRRRRR logicamente non va in errore adesso ma
cliccando su
http://localhost:1457/Contenuti/contenuti.aspx?id=8
 
si viene trasportati a
http://localhost:1457/Contenuti/contenuti.aspx?id=8
 
con contenuto
Chiave AspSession Valore: System.Web.SessionState.HttpSessionState
Chiave AspSessionIDManagerInitializeRequestCalled Valore: True
 
...e dove sono i parametri impostati?....quindi non è scattato 
quell'httphandler? e di 
nuovo...mando'cavolo_sbaglio_maremma_rewratizzata????
 
-- 
----- Italliaaaaa 3227! -----
Soldato Joker, cosa ci fa il soldato Palla di Lardo con quel fucile in 
mano nel mio fottutissimo bagno?
 
Sergente Artman [ da: "Full Metal Jacket" ]
 
 

 Wodka40° ha usato la sua tastiera per scrivere :
nel mentre scrivo mi chiarisco...quindi abbiate pazienza e sopportatemi 
se potete!
 
 <add verb="*" path ="*/Contenuti*.aspx" type =" 
MartekUrlRewriting.urlRewriting, MartekUrlRewriting" />
 
fa scattare la pagina e mi riporta
Chiave AspSession Valore: System.Web.SessionState.HttpSessionState
Chiave scemo Valore: BLLLLLEEEEEEEAH
Chiave filename Valore: contenuti
Chiave AspSessionIDManagerInitializeRequestCalled Valore: True
ma la pagina rimane sempre
http://localhost:1457/Contenuti/contenuti.aspx?id=8
 
 
....pffff.....un passo per volta!Come cavolo si cambia sto link!??!!
 
-- 
----- Italliaaaaa 3227! -----
Please, visits website, but please visit Italy. We’re t’best country in 
the world in terms of: Culture, Landscapes, Arts, History, Cities, 
Villages, Beautiful countryside, seaside, mountains. That is Italy. You 
know, perhaps, you dreaming about. But please, visit or country. We 
will welcome you warmly and with a better organization.
(Francesco Rutelli Video a: 
http://www.martek.it/dblog/mostraVideo.asp?p=/public/dblog/Rutelli1.wmv
 
)
 
 


Ciao Wodka,
dopo diversi test, esperimenti vari nel realizzare httpmodules e 
httphandler, mi sono imbattuto nel sito del mitico Scott Guthrie e da 
questa pagina 
http://weblogs.asp.net/scottgu/archive/2007/02/26/tip-trick-url-rewriting-with-asp-net.aspx
 
ho trovato il componente urlrewritingnet.urlrewrite 
http://www.urlrewriting.net/149/en/home.html
 
che ha risolto tutti i miei problemi!
 
Su Aruba funziona perfettamente e se hai bisogno di esempi per iniziare 
te li posto.
Se invece volessi continuare con il tuo codice, posso provare a cercare 
il codice dei miei primi esperimenti...
Fammi sapere!
Ciao, Vincenzo
 
 

 Ciao, Vincenzo
In realtà ho una confusione enorme in testa....
io ho capito che un
miadir/pippo.aspx?id=1
con urlrewriting NOn diventa altro!
Ma solo che
miadir/pippo-va-a-pesca.aspx mi si trasforma in  
miadir/pippo.aspx(eventualmente con ?d=1 )
Ad ora sta cosa dopo spippolamenti vari seul server interno di VS mi 
funziona!
Ma l'incontrario?
io ho un bel po di link che per comodità son tutti
miadir/pippo.aspx?id=qualcosa
c'è verso cliccare su questi link e trasformarli al volo in un 
miadir/pippo-va-a-pesca.aspx ?
Non so se si chiama ancora url rewriting o che....in linux dicono che 
c'è un modulo di apache diverso dal rewrite ma non m0hanno detto che(mi 
sa che mi prendevano in giro)
 
Mi piacerebbe capire l'ambarandan però!
 
 
per quanto riguarda la produzione:
Grazie della dritta alla fine mi sa che la userò
 
-- 
----- Italliaaaaa 3227! -----
Là dove l'uomo scopre un minimo di ordine, immediatamente ne suppone 
troppo.
(Francesco Bacone)
 
 


La tua risposta ha messo confusione anche a me ;-))
 
Prendiamo come esempio questo sito che ho realizzato qualche anno fa: 
www.vsantonio.it
 
Praticamente nel web.config c'è una regola del tipo:
 
<add name="News" virtualUrl="^~/post/(.*)/(.*).aspx" 
rewriteUrlParameter="ExcludeFromClientQueryString" 
destinationUrl="~/shownews.aspx?IDNews=$1" ignoreCase="true"/>
 
Quindi tutti i link che saranno del tipo POST/ID/TITOLO-DEL-POST.aspx 
verranno elaborati nella pagina shownews.aspx che preleverà solo l'ID 
dalla querystring per interrogare il DB
 
Di fatto non esiste nessuna directory Post.. ecc...
 
Lo stesso principio poi può essere adottato per realizzare la sitemap 
del sito con relativa visualizzazione breadcrumb... di fatto le pagine 
sono tutte sulla root del sito ma danno la sensazione di essere raccolte 
secondo uno schema a cartella.
 
Spero di essere stato abbastanza chiaro
Per qualsiasi cosa chiedi pure
Ciao, Vincenzo
 
 

 Il 11/11/2011 17:44, Wodka40° ha scritto:
perdona se ti metto confusione...
la tua risposta conferma la mia preoccupazione
miadir/contenuto.aspx?id=1
non si può trasformare in qualcosa d'altro!Non esiste un modulo o 
httphandler che invii al browser la pagina con un url "finto"!
 
La mia parziale ed insoddisfacente soluzione è un
        Public Shared Function CreaURLRewrite(Titolo As String, 
PathVirtuale As String) As String
            Dim s = Titolo.Replace(" "c, "-"c) + ".aspx"
            Dim ret As String = ""
            ret = Path.Combine(PathVirtuale, s)
            Return ret
        End Function
 
ed un uso del tipo
...
                    Dim paginaRewriting As String = 
Martek.business.CreaURLRewrite(riga("titolo").ToString, 
Request.ApplicationPath + "Contenuti/")
                    .AppendFormat("<a href=""{0}"" title=""contenuto 
notizia"" id=""newsrewriting""  >{1}</a>{2}", paginaRewriting, "(Leggi 
notizia...)", vbCrLf)
...
 
se voglio codificare l'id devo studiare combinazioni per fare un 
orribile
miadir/1/pippo-pluto.aspx
o non codificarlo proprio più...rendere il titolo univoco nel 
database...ricompattarlo nella pagina aspx e cercare nel database la 
notizia con quel titolo....(ma potrebbero esserci due notizie con il 
solito titolo della serie "Scoppia un petardo a topolinia" così mi lego 
le mani!)
 
insomma tappo un buco e ne apro un altro....
 
Grazie della risposta


Wodka40° ha pensato forte :
ho postato la richiesta anche sul forum Micrsoft di asp.net....ma tutto 
tace....
allora c'ho sbattuto il capo...ho trovato una soluzione funzionante nel 
mio pc! Su Aruba dubito funzioni...ma ho trovato un articolo con le 
cose da cambiare...proverò!
 
Cmq copio ed incollo la mia soluzione (tutt'altro che fine) che ho 
messo anche sul forum Microsoft
 
(cito)
 
...mi rispondo da solo.Casomai a qualcuno serve!
Premessa la complicazione nasce da un web usercontrol che andrà dentro 
un altro web usercontrol a sua volta dentro una webpage che deriva da 
una masterpage.
Il modulo è un classico news(per avvertire delle cose nuove dentro al 
sito) dentro una sidebar dentro una pagina che deriva da una 
masterpage....insomma roba che più classica non si può.
 
Ad esempio ad un certo punto ci sarò da mostrare la notizia con 
idcontenuto=9
 
Mi son messo nel mio user control "gestore di news" un linkbutton che 
dovrà caricare l'articolo relativo alla notizia dentro un altra webpage 
sottoposta ad url rewriting.
 
per costruire le news dentro il controllo ho 2 placeholder : quello 
delle news vere e proprie lo valorizzo con
 
 
 
<span style="white-space:normal"><pre lang="x-vbnet">            Dim 
controllo As New LiteralControl(thtml.ToString)
            Dim mylink As New LinkButton
 
            AddHandler mylink.Click, AddressOf mylink_click
            mylink.ID = "news_" + riga("idcontenuto").ToString
            mylink.ToolTip = paginaRewriting
            mylink.Text = "Leggi notizia"
            mylink.EnableViewState = True
            Me.linknews.Controls.Add(mylink)
            Me.linknews.Controls.Add(controllo)
 
 
        Next
e via andare
 
non mi funzionava il click e c'ho sbattuto parecchio la testa! Ora 
va....come ho fatto? Boh! uscito da VS rientrato ricompilato....ok! 
Misteri della fede in ZioBill!
 
Cosa ho pensato?
-) Dentro l'id del controllo metto l'id della notizia da mostrare
 
-) dentro il tooltip metto il nome "urlrewritato" della pagina (il link 
infatti appare come un postback di mezzora) almeno l'utente ci passa 
sopra e vede dove va a finire
 
 
 
    Protected Sub mylink_click(sender As Object, e As EventArgs)
        Dim t As LinkButton = CType(sender, LinkButton)
        Dim url As String
        Dim dummy As String = ""
        dummy = t.ID
        dummy = dummy.Replace("news_", "")
        url = "
http://localhost:1457
" + t.ToolTip
        Session.Add("IDchiesto", dummy)
        Response.Redirect(url, True)
   end sub
 
La mini funzione recupera dall'id il vero ID della risorsa da mostrare 
la memorizza in una risorsa e la invia alla pagina. Funziona!
 
Una soluzione più elegante ci sarebbe stata
        Dim t As LinkButton = CType(sender, LinkButton)
        Dim encoding As New ASCIIEncoding
        Dim myPOST As WebRequest
        Dim postDati As String
        Dim Dati() As Byte
        Dim url As String
        Dim dummy As String = ""
        dummy = t.ID
        dummy = dummy.Replace("news_", "")
        postDati = "IDart=" + dummy
        Dati = encoding.GetBytes(postDati)
        url = "
http://localhost:1457
" + t.ToolTip
        myPOST = WebRequest.Create(url)
        myPOST.Method = "POST"
        myPOST.ContentType = "application/x-www-form-urlencoded"
        myPOST.ContentLength = Dati.Length
 
 
 
        Dim newStream As System.IO.Stream = myPOST.GetRequestStream
        ' invio dati
        newStream.Write(Dati, 0, Dati.Length)
        newStream.Close()
 
 
in pratica mi creo delle richieste POST e le invio alla fine alla 
pagina....è una figata funziona tutto...ho testato che arrivava fino 
alla vera pagina mantenendo le variabili post settate.....
solo che non cambia pagina....non naviga ....mi costringe a fare
     Response.Redirect(url, True)
 
che mi REinvia la pagina....e quindi vedo arrivare 2 volte alla pagina 
vera....una con le variabili form valorizzate (la mia chiamata con  
getrequeststream) una con nessuna variabile form...il redirect!
 
Peccato sarebbe stata elegante come soluzione!
 
-- 
----- Italliaaaaa 3227! -----
Il coraggio ce l'ho. E' la paura che mi frega.
(Totò)
 
 

 memorizza in una risorsa e la invia alla pagina. Funziona!
La "risorsa" è una session...meglio specificare!
 
-- 
----- Italliaaaaa 3227! -----
Il grande maestro di pittura meta-gastro-fisica Luciano Lupoletti in:
David Arlequin
http://www.lupoletti.com/public/lupoletti/09-10-24-12-05-21@David%20Arlequin%20-%20Olio%20su%20tela.jpg
 
 
(ROTFL: oddio mi ribalto)
 
 

 La "risorsa" è una session...meglio specificare!
 
ed ovviamente....mi ero dimenticato di dirlo....sempre meglio 
specificare...è una strada a senso unico!
 
Dal click si carica una pagina con il contenuto dinamico...ma non 
essendo codificato nell'url il contenuto dinamico...esso viene perso in 
una eventuale indicizzazione non salvando il valore della session.
 
Alla fin fine se si desidera una indicizzazione funzionante da parte 
dei motori di ricerca...si ritorna all'url con una indicazione 
dell'id....
della serie
http://localhost:1457/Contenuti/11-Nuovo-web-site.aspx
 
o
http://localhost:1457/Contenuti/11/Nuovo-web-site.aspx
 
 
oppure cambiare il database e inserire un campo che indica il nome 
riscritto ...
SELECT * FROM Contenuti WHERE PagRewrite='Nuovo-web-site'
 
Farò alla fine così!
 
se a qualcuno interessa ho trovato un altro grezzo sistema per inserire 
dati post e fare un redirect....funziona!
http://www.codeproject.com/KB/aspnet/ASP_NETRedirectAndPost.aspx
 
 
Mo' non vi stresso più!
 
-- 
----- Italliaaaaa 3227! -----
Mi disturba la morte, è vero. Credo che sia un errore del padreterno. 
Non mi ritengo per niente indispensabile,
ma immaginare il mondo senza di me: che farete da soli?
(Vittorio Alfieri)