elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Normalizar un enlace de búsqueda de google
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Normalizar un enlace de búsqueda de google  (Leído 2,918 veces)
Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Normalizar un enlace de búsqueda de google
« en: 23 Enero 2016, 01:05 am »

Hola

No consigo obtener el enlace a los que redirecciona google por ejemplo:

Código:
https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiK3Ii9zr7KAhXD0RQKHekoC9kQFggcMAA&url=http%3A%2F%2Fwww.recursosvisualbasic.com.ar%2Fhtm%2Fvb-net%2F54-obtener-links-de-una-pagina-web.htm&usg=AFQjCNGMpwVIQ7z-vWEq6Urag9Vf_UAKGg&bvm=bv.112454388,d.d24

Redirecciona a...:

Código:
http://www.recursosvisualbasic.com.ar/htm/vb-net/54-obtener-links-de-una-pagina-web.htm


Yo utilizo el siguiente código para obtener el enlace al que redirecciona una determianda URL

Código
  1. #Region "Normalizar URL"
  2.    Public Function ResolverURL(ByVal strUrl As String) As String
  3.        Dim RedirectUrl As String = Nothing
  4.         strUrl = DecodeUrl(strUrl)
  5.        Try
  6.            Dim WebRequest As System.Net.HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(strUrl), System.Net.HttpWebRequest)
  7.            With WebRequest
  8.                .UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1"
  9.                'WebRequest.MaximumAutomaticRedirections = 1
  10.                .AllowAutoRedirect = True  '<==importante
  11.                '.ProtocolVersion = System.Net.HttpVersion.Version11
  12.                 .Method = "GET"
  13.                '.Timeout = 1000
  14.            End With
  15.  
  16.            Using webResponse As System.Net.HttpWebResponse = DirectCast(WebRequest.GetResponse, Net.HttpWebResponse)
  17.                RedirectUrl = webResponse.ResponseUri.AbsoluteUri
  18.                webResponse.Close() '<===importante
  19.            End Using
  20.        Catch ex As System.Net.WebException
  21.            If ex.Status = Net.WebExceptionStatus.NameResolutionFailure Then
  22.                MessageBox.Show("El Sitio no existe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
  23.            End If
  24.        End Try
  25.        Return RedirectUrl
  26.    End Function
  27.   Public Function DecodeUrl(ByVal strUrl As String) As String
  28.        Dim HexCaracter As String()
  29.        HexCaracter = strUrl.Split(CChar("%"))
  30.        For I As Integer = 1 To HexCaracter.Length - 1
  31.            Dim Cr As String = HexCaracter(I).Substring(0, 2)
  32.            Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16))
  33.            strUrl = strUrl.Replace("%" & Cr, newCr)
  34.        Next
  35.        Return strUrl
  36.    End Function
  37. #End Region
  38.  


Este código se usa del modo siguiente:
Código
  1. Public Class Form1
  2.  
  3.    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  4.        TextBox1.Text = ResolverURL(URL)
  5.    End Sub
  6.  

Sin embargo no me funciona con los enlaces que ofrece Google en el listado de búsqueda.

S2s



Una forma que he ideado es esta:

Código
  1.  
  2.   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  3.        Dim strUrl as String = "https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwidgYbs98HKAhUJLhoKHRwBBzYQFggcMAA&url=https%3A%2F%2Fes.wikipedia.org%2Fwiki%2FAlbert_Einstein&usg=AFQjCNEpx7ZvmsTJayPwnY-RF0W1AbWLGw&bvm=bv.112454388,d.d2s"
  4.  
  5.         strUrl = DecodeUrl(strUrl)
  6.  
  7.        Dim uri As New Uri(strUrl)
  8.        Dim dirs As String = uri.GetComponents(UriComponents.AbsoluteUri, UriFormat.UriEscaped)
  9.  
  10.        Try
  11.            Dim dirArray As String() = dirs.Split(CChar("="))
  12.            For I As Integer = 1 To dirArray.Length - 1
  13.                If dirArray(I).Length > 4 Then
  14.                    If dirArray(I).Substring(0, 4) = "http" Then
  15.                        strUrl = dirArray(I).Replace("&usg", "")
  16.                        Exit For
  17.                    End If
  18.                End If
  19.            Next
  20.        Catch ex As Exception
  21.        End Try
  22.  
  23.        TextBox1.Text = strUrl
  24.  
  25. End Sub
  26.    Public Function DecodeUrl(ByVal strUrl As String) As String
  27.        Dim HexCaracter As String()
  28.        HexCaracter = strUrl.Split(CChar("%"))
  29.        For I As Integer = 1 To HexCaracter.Length - 1
  30.            Dim Cr As String = HexCaracter(I).Substring(0, 2)
  31.            Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16))
  32.            strUrl = strUrl.Replace("%" & Cr, newCr)
  33.        Next
  34.        Return strUrl
  35.    End Function
  36.  

Pero mi intención es que conseguir un método general que sirva para cualquier URL sin afectar a URLs que no redireccionen. De otro modo tengo que hacer que el programa determine si es redireccionable y si lo es, si éste es de Google para aplicar el código que acabo de mostrar... Esto no me convence.




Bueno, lo he resuelto de la siguiente manera. Que como dije  obtiene la URL a la que redirecciona de forma selectiva. Si es de Google aplica un método y si no lo es aplica el otro.

Código
  1. #Region "Normalizar URL"
  2.    Public Function NormalizarUrl(ByVal strUrl As String) As String
  3.        strUrl = DecodeUrl(strUrl)
  4.        Task.Factory.StartNew(Sub()
  5.                                  If strUrl.Contains("www.google.es/url?") = True Then
  6.                                      '//Obtiene la Url a la que redirecciona
  7.                                      strUrl = ResolverUrlGoogle(strUrl)
  8.                                  Else
  9.                                      '//Si el Url redireciona a otra Url obtiene la Url a la que redirecciona
  10.                                      strUrl = ResolverURL(strUrl)
  11.                                  End If
  12.                                  ComboBox1.Invoke(DirectCast(Sub() ComboBox1.Text = strUrl, MethodInvoker))
  13.                              End Sub)
  14.  
  15.  
  16.        Return strUrl
  17.    End Function
  18.    Public Function DecodeUrl(ByVal strUrl As String) As String
  19.        Dim HexCaracter As String()
  20.        HexCaracter = strUrl.Split(CChar("%"))
  21.        For I As Integer = 1 To HexCaracter.Length - 1
  22.            Dim Cr As String = HexCaracter(I).Substring(0, 2)
  23.            Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16))
  24.            strUrl = strUrl.Replace("%" & Cr, newCr)
  25.        Next
  26.        Return strUrl
  27.    End Function
  28.    Public Function ResolverUrlGoogle(ByVal strUrl As String) As String
  29.  
  30.        Dim uri As New Uri(strUrl)
  31.        Dim dirs As String = uri.GetComponents(UriComponents.AbsoluteUri, UriFormat.UriEscaped)
  32.        Try
  33.            Dim dirArray As String() = dirs.Split(CChar("="))
  34.            For I As Integer = 1 To dirArray.Length - 1
  35.                If dirArray(I).Length > 4 Then
  36.                    If dirArray(I).Substring(0, 4) = "http" Then
  37.                        strUrl = dirArray(I).Replace("&usg", "")
  38.                        Exit For
  39.                    End If
  40.                End If
  41.            Next
  42.        Catch ex As Exception
  43.        End Try
  44.        Return strUrl
  45.    End Function
  46.    Public Function ResolverURL(ByVal strUrl As String) As String
  47.        Dim RedirectUrl As String = Nothing
  48.        strUrl = DecodeUrl(strUrl)
  49.  
  50.        Try
  51.            Dim WebRequest As System.Net.HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(strUrl), System.Net.HttpWebRequest)
  52.            With WebRequest
  53.                WebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1"
  54.                'WebRequest.MaximumAutomaticRedirections = 1
  55.                WebRequest.AllowAutoRedirect = True  '<==importante
  56.            End With
  57.            Using webResponse As System.Net.HttpWebResponse = DirectCast(WebRequest.GetResponse, Net.HttpWebResponse)
  58.                RedirectUrl = webResponse.ResponseUri.AbsoluteUri
  59.                webResponse.Close() '<===importante
  60.            End Using
  61.        Catch ex As System.Net.WebException
  62.            If ex.Status = Net.WebExceptionStatus.NameResolutionFailure Then
  63.                MessageBox.Show("El Sitio no existe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
  64.            End If
  65.        End Try
  66.        Return RedirectUrl
  67.    End Function
  68. #End Region
  69.  

Sirve para evitar errores al usar System.Net.HttpWebRequest o System.Net.WebClient con URLs que redireccionan.



NOTA:
He hecho algunas correcciones y modificaciones respecto al código que expuse ayer.
Disculpen las molestias


He añadido por ejemplo esta función:

Código
  1. Public Function DecodeUrl(ByVal strUrl As String) As String
  2.        Dim HexCaracter As String()
  3.        HexCaracter = strUrl.Split(CChar("%"))
  4.        For I As Integer = 1 To HexCaracter.Length - 1
  5.            Dim Cr As String = HexCaracter(I).Substring(0, 2)
  6.            Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16))
  7.            strUrl = strUrl.Replace("%" & Cr, newCr)
  8.        Next
  9.        Return strUrl
  10.    End Function

Ya que yo creía que sólo había que sustituir "%3A" por ":" y "%2F" por "/". Entonces he visto otro enlace con "%3F" y comprendí que se trata de número de un carácter convertido a hexadecimal. Es decir 3A = 58 que equivale a ":" y 2F = 47 que equivale a "/". He hecho esa función para sustituir cualquier código hexadecimal por su carácter correspondiente. 


Por otro lado la función ResolverUrlGoogle tampoco estaba bien del todo . No todos los enlaces, pasados por split se encuentran el la posición 10 del array. Así que hago que  busque la url dentro del array. De todos modos aún no está perfecto  porque hay enlaces, aunque poco comunes, que se devuelven incompletos o con algún carácter demás.


Sl2s


« Última modificación: 24 Enero 2016, 09:51 am por Lekim » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: Normalizar un enlace de búsqueda de google
« Respuesta #1 en: 24 Enero 2016, 14:39 pm »

yo creía que sólo había que sustituir "%3A" por ":" y "%2F" por "/". Entonces he visto otro enlace con "%3F" y comprendí que se trata de número de un carácter convertido a hexadecimal. Es decir 3A = 58 que equivale a ":" y 2F = 47 que equivale a "/".

Son las entidades Html:



He hecho esa función para sustituir cualquier código hexadecimal por su carácter correspondiente.

En realidad la función que hiciste es innecesaria, por que ya está hecha. Es el momento para que le eches un vistazo a la class HttpUtility:


Ejemplo:
Código
  1. Imports System.Web
  2.  
  3. Dim encoded As String = "https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwidgYbs98HKAhUJLhoKHRwBBzYQFggcMAA&url=https%3A%2F%2Fes.wikipedia.org%2Fwiki%2FAlbert_Einstein&usg=AFQjCNEpx7ZvmsTJayPwnY-RF0W1AbWLGw&bvm=bv.112454388,d.d2s"
  4. Dim decoded As String = HttpUtility.UrlDecode(encoded)
  5.  
  6. Console.WriteLine(decoded) ' https://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwidgYbs98HKAhUJLhoKHRwBBzYQFggcMAA&url=https://es.wikipedia.org/wiki/Albert_Einstein&usg=AFQjCNEpx7ZvmsTJayPwnY-RF0W1AbWLGw&bvm=bv.112454388,d.d2s



la función ResolverUrlGoogle tampoco estaba bien del todo. No todos los enlaces, pasados por split se encuentran el la posición 10 del array.

Si no he entendido mal, tu propósito real no es redireccionar la url, sino intentar obtener el valor del parámetro "url" de la query de Google, y entonces no necesitas hacer más que recurrir de nuevo a la class HttpUtility.

Ejemplo:
Código
  1. Imports System.Web
  2.  
  3. Dim googleQuery As String = "http://www.google.es/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiK3Ii9zr7KAhXD0RQKHekoC9kQFggcMAA&url=http%3A%2F%2Fwww.recursosvisualbasic.com.ar%2Fhtm%2Fvb-net%2F54-obtener-links-de-una-pagina-web.htm&usg=AFQjCNGMpwVIQ7z-vWEq6Urag9Vf_UAKGg&bvm=bv.112454388,d.d24"
  4. Dim urlValue As String = HttpUtility.ParseQueryString(googleQuery).Item("url")
  5.  
  6. Console.WriteLine(urlValue) ' http://www.recursosvisualbasic.com.ar/htm/vb-net/54-obtener-links-de-una-pagina-web.htm



Como consejo, intenta tener siempre presente que la librería de classes de .Net Framework es la más extensa y gigantesca que existe en el ámbito de los lenguajes de programación, y debido a eso en la mayoría de ocasiones es bastante posible hallar algún método (o type) built-in optimizado para evitarte desarrollar algoritmos propios, e imperfectos (en general). Aunque estés casi convencido de que probablemente no existirá nada al respecto (como por ejemplo la función de decodificación de entidades html), deberías buscar o preguntar al respecto, por el "nunca se sabe".

Si no estás seguro de cual podría ser la mejor forma de llevar a cabo una tarea entonces, antes de ponerte a hacer ningún algoritmo, podrías preguntar en el foro para que te orientemos sobre las posibles opciones...

A todos nos ha pasado algo similar, me refiero a desarrollar "un centenar" de lineas de código y descubrir que se puede reducir a un par de lineas (no solo reducir en este caso, sino mejorar), es algo que puede doler un poco por el esfuerzo invertido en nuestro propio algoritmo pero acabar descartando y sustituyendo ese algoritmo, en tu caso, es lo correcto para obtener la eficiencia del uso de los métodos integrados en la librería de clases de .Net Framework, y es algo positivo también en el sentido de que cosas como esta son la base del aprendizaje hacia el dominio de técnicas de refactorización de código (habilidad muy importante y util en un programador), y aparte, es algo normal que sucedan estas cosas... ya que es imposible conocer al 100% todos los miembros de .Net Framework y sus diversas utilidades.



Por último me gustaría añadir que para redireccionar urls yo utilizo la siguiente metodología (tal vez no funcionará con todas las urls, pero quizás te sirva en otras circunstancias ya que es una solución de uso genérico como lo que estás intentando):

Aunque es un código muy simple y sin misterio, debo mencionar que lo he sacado de mi API ElektroKit:



Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Redirects an Url that points to other Url.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <example> This is a code example.
  7. ''' <code>
  8. ''' Dim url As String = "http://goo.gl/PsCZN4"
  9. ''' Dim redirect As String = RedirectUrl(url, count:=1)
  10. ''' </code>
  11. ''' </example>
  12. ''' ----------------------------------------------------------------------------------------------------
  13. ''' <remarks>
  14. ''' Url redirection, also called Url forwarding,
  15. ''' is a World Wide Web technique for making a web page available under more than one Url address.
  16. ''' <para></para>
  17. ''' When a web browser attempts to open a Url that has been redirected, a page with a different Url is opened.
  18. ''' </remarks>
  19. ''' ----------------------------------------------------------------------------------------------------
  20. ''' <param name="url">
  21. ''' The Url to redirect.
  22. ''' </param>
  23. '''
  24. ''' <param name="count">
  25. ''' The amount of times to redirect the redirected Url.
  26. ''' </param>
  27. ''' ----------------------------------------------------------------------------------------------------
  28. ''' <returns>
  29. ''' The resulting Url.
  30. ''' </returns>
  31. ''' ----------------------------------------------------------------------------------------------------
  32. <DebuggerStepThrough>
  33. Public Shared Function RedirectUrl(ByVal url As String,
  34.                                   Optional ByVal count As Integer = 1) As String
  35.  
  36.    Dim request As WebRequest
  37.  
  38.    For x As Integer = 0 To (count - 1)
  39.  
  40.        request = HttpWebRequest.Create(url)
  41.        Using response As WebResponse = request.GetResponse
  42.  
  43.            If response.ResponseUri.AbsoluteUri.Equals(url) Then
  44.                Exit For
  45.  
  46.            Else
  47.                url = response.ResponseUri.AbsoluteUri
  48.  
  49.            End If
  50.  
  51.        End Using
  52.  
  53.    Next x
  54.  
  55.    Return url
  56.  
  57. End Function

Ejemplo de uso:
Código
  1. Imports Elektro.Net.Tools.NetworkUtil
  2.  
  3. ' http://plixid.com/2016/01/20/megadeth-dystopia-2016-mp3/
  4. Dim complexUrl As String = "http://r.plixid.com/r/CJ6o5x_DZIPnJTlA2uzJv1VBzYRa1dadJROc05Qi5lu018wnr2bc1NW28GpKRu5zoOarRCnvEEhbbH_lEivAn3-tA3AK2fzw7TvVj2PWnI9yctnTHr3D0OnmyrlrgVJ5eN8Ff3CIbIeEGkrZPmbacA.."
  5. Dim redirectedUrl As String = RedirectUrl(complexUrl, 1)
  6.  
  7. Console.WriteLine(redirectedUrl) ' http://uploaded.net/file/u9t1ez2w

Saludos!


« Última modificación: 24 Enero 2016, 16:11 pm por Eleкtro » En línea


Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Normalizar un enlace de búsqueda de google
« Respuesta #2 en: 25 Enero 2016, 07:58 am »

Hola

Cuando vi tu respuesta y nombraste la clase HttpUtility, fue una alegría, por fin lo que buscaba. Incluso te envié un mensaje de agradecimiento para no añadir más comentarios a este tema.

Pero mi alegría se convirtió en decepción al comprobar que dicha clase (HttpUtility) ne se encuentra dentro de System.Web, es más, en el enlace que facilitas HttpUtility Clase, abajo, en los comentarios, puede verse que un usuario tiene el mismo problema, del cual creo no aparece la solución. Se supone que forma parte de .NET Framework 4 pero desde luego al parecer en el mío no está.

Sl2s







En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: Normalizar un enlace de búsqueda de google
« Respuesta #3 en: 25 Enero 2016, 10:35 am »

Hola

Cuando vi tu respuesta y nombraste la clase HttpUtility, fue una alegría, por fin lo que buscaba. Incluso te envié un mensaje de agradecimiento para no añadir más comentarios a este tema.

Pero mi alegría se convirtió en decepción al comprobar que dicha clase (HttpUtility) ne se encuentra dentro de System.Web, es más, en el enlace que facilitas HttpUtility Clase, abajo, en los comentarios, puede verse que un usuario tiene el mismo problema, del cual creo no aparece la solución. Se supone que forma parte de .NET Framework 4 pero desde luego al parecer en el mío no está.

( No me ha llegado ningún "mensaje" por tu parte )

Si lees detenidamente los comentarios verás que la solución si que se menciona, aunque de forma indirecta.

Lo que se menciona al problema que indicas es que la class no está disponible en el perfil de cliente de .Net Framework 4.0 ( algo relativamente comprensible ya que es una distribuición del paquete limitado/reducido de .Net framework ), el cual es indudablemente el framework objetivo con el que estás intentando trabajar en VS y por ese motivo no encuentras el miembro.

Para solucionarlo, simplemente debes instalar el perfil completo de .Net Framework 4.0, en general debes instalar siempre el perfil completo para el .Net Framework que sea con el que tengas pensado desarrollar...


Otra solución sería que instalases .Net Framework 4.5, ya que al instalar esta versión de .Net Framework, el perfil cliente de 4.0 que tienes instalado se actualizaría automaticamente al perfil completo, o al menos eso indica Microsoft:

PD: Para evitarte futuras confusiones, nótese que a partir de .Net Framework 4.5 ya no se distribuyen perfiles de cliente.

Saludos
« Última modificación: 25 Enero 2016, 12:18 pm por Eleкtro » En línea


Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Normalizar un enlace de búsqueda de google
« Respuesta #4 en: 12 Marzo 2016, 17:24 pm »

Hola


Me veo obligado a reabrir este tema ya que puede haber gente que no encuentre la clase  System.Web.httpUtility, que mencionó Elektro.

Tras instalar :
Microsoft .NET Framework 4 Client Profile
Microsoft .NET Framework 4 Full Profile

Siguía sin poder importar dicha clase. Ni siquiera la encuentro en el cuadro Agregar Referencias que puedes encontrar en el menú Proyecto. Tampoco seleccionar, si tienes disponible en referencias System.Web.

Pues bien, la clase System.Web.httpUtility se encuentra en un archivo llamado System.Web.dll. Sin embargo, NO está disponible en todas las versiones de dicho archivo.

System.Web.dll  2.0.50727.312    
System.Web.httpUtility     NO DISPONIBLE

System.Web.dll  4.6.81.0  
System.Web.httpUtility NO DISPONIBLE

System.Web.dll  4.0.30319.1  
System.Web.httpUtility NO DISPONIBLE

System.Web.dll  2.0.50727.4016
System.Web.httpUtility DISPONIBLE

System.Web.dll  2.0.50727.4205
System.Web.httpUtility DISPONIBLE

Que no, que no hay error. Has visto bien, 2.0.50727.4016 y no en versiones más recientes como 4.0 o 4.6. ¿Porqué? Ni pajotera y idea  :xD. Puede que esté disponible en versiones 64bits, yo que se...


Puedes buscar mediante el sistema de búsqueda de windows (Tecla windows + F) y buscar los distintos archivos System.Web.dll en el disco.

Luego en el entorno de VB.NET abrir el cuadro 'Agregar Referencia'
y pestaña 'Examinar' agregar el archivo System.Web.dll.

Ahora si la versión de System.Web.dll es la que buscamos, al teclear Imports System.web._ aparecerá una lista amplia de opciones, incluída  System.Web.httpUtility

Espero a alguien le sirva  ;)

S2s
« Última modificación: 12 Marzo 2016, 20:42 pm por Lekim » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: Normalizar un enlace de búsqueda de google
« Respuesta #5 en: 12 Marzo 2016, 18:48 pm »

Hola

Lo primero de todo que quiero explicar (para quien no lo sepa) es que la versión del archivo hace referencia a la versión de .Net Framework, versión 2.0 = .Net Framework 2.0, versión 4.0 = .Net Framework 4.0 (el resto es el número de la build)

Bien, sabiendo esto, simplemente usa la lógica de la siguiente manera:
Si la class se encuentra en la versión 2.0 de .Net Framework, la misma class se debe encontrar en la versión 4.0, no hace falta comprobarlo, pero lo puedes comprobar con aplicaciones como .Net Reflector, Simple Assembly Explorer, o ILSpy (o simplemente observaando la información del ensamblado en la documentación online de la MSDN.), te aseguro que se encuentran en ambas versiones y de ambas arquitecturas (y si, lo he comprobado aunque no hiciera falta, por que no me gusta hablar sin verificar al 100%. )

 

( El número de ensamblado ignorarlo, puesto que no es lo mismo que el número de archivo, pero como ya te digo lo he comprobado con los números de archivo 2.0.x y 4.0.x del perfil completo )



Que no, que no hay error. Has visto bien

Los datos que has proporcionado se debe a que, o bien lo has comprobado erroneamente (has comprobado los archivos de la instalación compacta), o tienes algún tipo de conflicto con la instalación del .Net Framework compacto y la instalación completa, puesto que si no encuentras la class HttpUtility es por que estás analizando el ensamblado de la instalación compacta (el perfil cliente), mi consejo: Haz una instalación limpia del perfil completo de .Net Framework 4.0 (o deja de usar Windows XP, es otra solución :P).

Para que te sirva de ayuda y puedas verificar si tienes los archivos correctos en tu PC, aquí te dejo mis archivos con un par de hashes para que compares (aunque quizás no te sirva, ya que los números de build que has mencionado no se corresponden a estos del perfil completo):

System.Web.dll v2.0.50727.7905  x86 | MD5: 1828cc36f4c32e6e9107442c18bab4d4 | SHA1: 58efd875768818e525fa8a2b8110d9231cb30848
System.Web.dll v2.0.50727.7905  x64 | MD5: 02ae2cc1b00dae66b08f1a1ae22f3407 | SHA1: 8afdbc8a26063a50cf963034e67f5436871c19c1
System.Web.dll v4.0.30319.33440 x86 | MD5: ddece90e17b888567f129af5072e5a7d | SHA1: 69a771623fe030c032b1a24fee313c8b54967190
System.Web.dll v4.0.30319.33440 x64 | MD5: 434536963bed0da0c8e722252014a2d6 | SHA1: 973c796405f02590a786c0f1b6173112e73bcdf2


Puedes probar a activar la columna "Nombre Producto" en el explorador de Windows, quizás te diga si tus archivos se tratan de la versión compacta o no (no estoy seguro de la descripción que dará si se trata de compacta, solo es una sugerencia para que pruebes a ver si te dice algo de utilidad)

Saludos!
« Última modificación: 12 Marzo 2016, 19:05 pm por Eleкtro » En línea


Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Normalizar un enlace de búsqueda de google
« Respuesta #6 en: 12 Marzo 2016, 20:00 pm »

Hola Elektro

Antes de nada comentarte que dicha comprobación no la he hecho desde XP si no desde Vista.  Uso también W7 64bits  pero debido a un problema lo desinstalé y lo tengo que volver a instalar.

Y segundo la comprobación de la versión del archivo System.Web.dll, es la que me proporciona el propio archivo. Ya sabes.. Clic botón derecho, Propiedades, Detalles...y ahí muestra la versión.

La otra fuente es del propio VB.NET. En el cuadro 'Agregar Referencia' y pestaña 'Reciente' pueden verse un lista de los componentes agregados recientemente. Las versiones que he puesto esas mismas, que coinciden con la de 'Propiedades' del propio archivo.

Por cierto, no se que pasa que parece que mis mensajes no te llegan, porque te envié un mensaje explicando el asunto y mostrando los directorios donde encontré los archivos:

Código:
Finalmente conseguí importar system.web.HttpUtility
. Aunque tirando un poco de picardía.

Buscando información en la red, me entero que dicha clase se encuentra en un archivo llamado system.web.dll.

Tengo que decir antes de nada que instalé el Framework 4.6 y nada, que tampoco. Me di cuenta que en mi sistema hay distintas versiones de System.Web.dll.

La más reciente, con fecha de modificación:
Código:
‎‎viernes, ‎19‎ de ‎junio‎ de ‎2015, ‏‎23:14:56

Se encuentra en:

Código:
C:\Windows\Microsoft.NET\Framework\v4.0.30319

Sin embargo al cargarlo desde el cuadro de Agregar Referencia y pestaña Examinar, tampoco me carga dicha clase


Sigo buscando y encuentro otro en:
Código:
C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0

Con fecha de modificación:
Código:
‎jueves, ‎18‎ de ‎marzo‎ de ‎2010, ‏‎18:31:26

Pero NO contiene dicha clase.


Voy probando con diferentes versiones y la que SI contenía dicha clase se encontraba en:
Código:
C:\Windows\winsxs\x86_system.web_b03f5f7f11d50a3a_6.0.6002.18005_none_f703314f16d55e23

con fecha de modificación:
Código:
‎‎‎domingo, ‎29‎ de ‎marzo‎ de ‎2009, ‏‎20:42:20

Puede verse que ni en V4.0 ni en 4.6 System.Web.dll contiene dichas clases. Por lo menos en mi sistema.

Independientemente del ensamblado y la versión si el archivo está en ...Microsoft\Framework\.NETFramework\v4.0  es que es del paquete de Framework4 y si está en C:\Windows\Microsoft.NET\Framework\v4.0.30319, igual, etc. Digo yo. Y dichos archivos los he cargado desde el cuadro de 'Agregar Referencia' (de ahí el historial de recientes con su número de versión) y no me carga las clases.

Si hay un conflicto ahí, ya no se.



En el directorio C:\Windows\Microsoft.NET\Framework , se encuentran los siguientes carpetas:
3082
v1.0.3705
v1.1.4322
v2.0.50727
v3.0
v3.5
v4.0.30319

v2.0.50727  contiene un archivo System.Web.dll  el cual SI me carga la clase System.web.HttpUtility
Código:
Length Of Struc: 03BCh
Length Of Value: 0034h
Type Of Struc:   0000h
Info:            VS_VERSION_INFO
Signature:       FEEF04BDh
Struc Version:   1.0
File Version:    2.0.50727.4205
Product Version: 2.0.50727.4205
File Flags Mask: 0.63
File Flags:      
File OS:         WINDOWS32
File Type:       DLL
File SubType:    UNKNOWN
File Date:       00:00:00  00/00/0000

     Struc has Child(ren). Size: 864 bytes.

Child Type:         StringFileInfo
Language/Code Page: 1033/1200
CompanyName:        Microsoft Corporation
FileDescription:    System.Web.dll
FileVersion:        2.0.50727.4205 (VistaSP2GDR.050727-4200)
InternalName:       System.Web.dll
LegalCopyright:     © Microsoft Corporation.  All rights reserved.
OriginalFilename:   System.Web.dll
ProductName:        Microsoft® .NET Framework
ProductVersion:     2.0.50727.4205
Comments:           Flavor=Retail

Child Type:         VarFileInfo
Translation:        1033/1200


v4.0.30319 Contiene un archivo  System.Web.dll   que NO me carga la clase Sytem.Web.HttpUtility

Código:
Length Of Struc: 03CCh
Length Of Value: 0034h
Type Of Struc:   0000h
Info:            VS_VERSION_INFO
Signature:       FEEF04BDh
Struc Version:   1.0
File Version:    4.6.81.0
Product Version: 4.0.30319.0
File Flags Mask: 0.63
File Flags:      PRIVATE BUILD;
File OS:         WINDOWS32
File Type:       DLL
File SubType:    UNKNOWN
File Date:       00:00:00  00/00/0000

     Struc has Child(ren). Size: 880 bytes.

Child Type:         StringFileInfo
Language/Code Page: 1033/1200
CompanyName:        Microsoft Corporation
FileDescription:    System.Web.dll
FileVersion:        4.6.81.0 built by: NETFXREL2
InternalName:       System.Web.dll
LegalCopyright:     © Microsoft Corporation.  All rights reserved.
OriginalFilename:   System.Web.dll
ProductName:        Microsoft® .NET Framework
ProductVersion:     4.6.81.0
Comments:           Flavor=Retail
PrivateBuild:       DDBLD031C

Child Type:         VarFileInfo
Translation:        1033/1200

Voy a desinstalar y volver a instalar el Framework a ver que pasa

Quizás system.web.dll sea distinto según la versión de windows, no se.

S2s



FRAMEWORK PARA VB.NET
« Última modificación: 13 Marzo 2016, 03:37 am por Lekim » En línea

Lekim

Desconectado Desconectado

Mensajes: 268



Ver Perfil
Re: Normalizar un enlace de búsqueda de google
« Respuesta #7 en: 12 Marzo 2016, 22:39 pm »

...Ahora si que tengo conflicto.

Porque después de desinstalar el FramWork y volverlo a instalar, ahora VB.Net me dice que debo seleccionar un Framework, y en la activación decomponentes de windows no aparece el 4, solo el 3 y además se queda conjelado cuando lo activa... Con la rabia que me da tener que esperar, y las barras de progreso, puff

Muchas gracias...  ;-)



Bueno, finalmente tuve que reinstalar VB.NET. Y tras instalar el Framework 4.5, seguía sin aparecer la clase System.Web.HttpUtility.

Pero.... utilizando el Desensamblador de NET, veo que en todas las versiones de System.Web.dll se encuentra dicha clase. Que no quiere decir que luego esté disponible la clase System.Web.HttpUtility.


(en este imagen puede verse system.web.httpUtility pero la clase no se me carga en Net cuando importo esta versión de System.Web.dll en el Framework 4.x)

Sin embargo VB.NET, no carga la clase con todas las versiones System.Web.dll, no se porqué. Quizás dependa de la versión que se use de .NET y el Framework compatible con esa versión.

El tema es interesante y curioso, pero ya es un poco cansino como para ir instalado versiones de Windows,  NET y Framework, que no se hace en 5 minutos precisamente. Es lo malo de windows, con tantos cambios, versiones, etc, pasan estas cosas.

El caso es y ya he explicado arriba. Que si no lo tienes disponible la clase que quieres usar puedes probar en buscar otra versión de System.Web.dll e importarlo desde le cuadro Agregar referencias.  Si es q te vale la pena.

S2s

« Última modificación: 13 Marzo 2016, 03:40 am por Lekim » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.708



Ver Perfil
Re: Normalizar un enlace de búsqueda de google
« Respuesta #8 en: 21 Marzo 2016, 13:38 pm »

Bueno, tu has desarrollado la función alternativa para decodificar, y yo simplemente quiero compartir una función alternativa para codificar...

La diferencia entre esta función y la de Microsoft, es que el código de por ciento se escribe en mayúscula (un capricho que tengo, por que prefiero los valores hexadecimales en mayúscula).

Aquí tienen:
Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Encodes a Url string.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <remarks>
  7. ''' For more info, see Percent-encoding rule specifications:
  8. ''' <para></para>
  9. ''' In English: <see href="http://en.wikipedia.org/wiki/Percent-encoding"/>
  10. ''' <para></para>
  11. ''' In Spanish: <see href="http://es.wikipedia.org/wiki/C%C3%B3digo_porciento"/>
  12. ''' </remarks>
  13. ''' ----------------------------------------------------------------------------------------------------
  14. ''' <example> This is a code example.
  15. ''' <code>
  16. ''' Dim encoded As String = UrlEncode("http://www.website.com/page.asp?id=5&amp;test=Hello World")
  17. ''' </code>
  18. ''' </example>
  19. ''' ----------------------------------------------------------------------------------------------------
  20. ''' <param name="url">
  21. ''' The Url to encode.
  22. ''' </param>
  23. ''' ----------------------------------------------------------------------------------------------------
  24. ''' <returns>
  25. ''' The resulting encoded Url.
  26. ''' </returns>
  27. ''' ----------------------------------------------------------------------------------------------------
  28. <DebuggerStepThrough>
  29. Public Shared Function UrlEncode(ByVal url As String) As String
  30.  
  31.    ' HttpUtility.UrlEncode() writes the percent-code in lower-case,
  32.    ' this is a custom method to write the percent-code in upper-case.
  33.  
  34.    Const Excluded As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!()*"
  35.  
  36.    Dim sb As New StringBuilder()
  37.    For Each c As Char In url
  38.  
  39.        Select Case c
  40.  
  41.            Case " "c
  42.                sb.Append("+"c)
  43.  
  44.            Case Else
  45.                If (Excluded.Contains(c, EqualityComparer(Of Char).Default)) Then
  46.                    sb.Append(c)
  47.  
  48.                Else
  49.                    For Each value As Byte In Encoding.UTF8.GetBytes(c)
  50.                        sb.AppendFormat("%{0:X2}", value)
  51.                    Next value
  52.  
  53.                End If
  54.  
  55.        End Select
  56.  
  57.    Next c
  58.  
  59.    Return sb.ToString()
  60.  
  61. End Function

Nota: La función HttpUtility.UrlDecode() toma perfectamente los valores hexadecimales en mayúscula.

Saludos!
« Última modificación: 21 Marzo 2016, 13:53 pm por Eleкtro » En línea


Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Busqueda en el foro por google.com
Sugerencias y dudas sobre el Foro
APOKLIPTICO 8 2,532 Último mensaje 11 Junio 2009, 00:29 am
por APOKLIPTICO
Google Instant: Nuevo servicio de Google que muestra los resultados de búsqueda
Noticias
wolfbcn 1 1,517 Último mensaje 9 Septiembre 2010, 00:21 am
por Castiblanco
Normalizar un Vector
Programación C/C++
Kougami 3 2,898 Último mensaje 11 Mayo 2017, 09:44 am
por Kougami
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines