Autor
|
Tema: Normalizar un enlace de búsqueda de google (Leído 4,952 veces)
|
Lekim
Desconectado
Mensajes: 268
|
Hola No consigo obtener el enlace a los que redirecciona google por ejemplo: 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...: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 #Region "Normalizar URL" Public Function ResolverURL(ByVal strUrl As String) As String Dim RedirectUrl As String = Nothing strUrl = DecodeUrl(strUrl) Try Dim WebRequest As System.Net.HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(strUrl), System.Net.HttpWebRequest) With WebRequest .UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1" 'WebRequest.MaximumAutomaticRedirections = 1 .AllowAutoRedirect = True '<==importante '.ProtocolVersion = System.Net.HttpVersion.Version11 .Method = "GET" '.Timeout = 1000 End With Using webResponse As System.Net.HttpWebResponse = DirectCast(WebRequest.GetResponse, Net.HttpWebResponse) RedirectUrl = webResponse.ResponseUri.AbsoluteUri webResponse.Close() '<===importante End Using Catch ex As System.Net.WebException If ex.Status = Net.WebExceptionStatus.NameResolutionFailure Then MessageBox.Show("El Sitio no existe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End Try Return RedirectUrl End Function Public Function DecodeUrl(ByVal strUrl As String) As String Dim HexCaracter As String() HexCaracter = strUrl.Split(CChar("%")) For I As Integer = 1 To HexCaracter.Length - 1 Dim Cr As String = HexCaracter(I).Substring(0, 2) Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16)) strUrl = strUrl.Replace("%" & Cr, newCr) Next Return strUrl End Function #End Region
Este código se usa del modo siguiente: Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click TextBox1.Text = ResolverURL(URL) End Sub
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: Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 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" strUrl = DecodeUrl(strUrl) Dim uri As New Uri(strUrl) Dim dirs As String = uri.GetComponents(UriComponents.AbsoluteUri, UriFormat.UriEscaped) Try Dim dirArray As String() = dirs.Split(CChar("=")) For I As Integer = 1 To dirArray.Length - 1 If dirArray(I).Length > 4 Then If dirArray(I).Substring(0, 4) = "http" Then strUrl = dirArray(I).Replace("&usg", "") Exit For End If End If Next Catch ex As Exception End Try TextBox1.Text = strUrl End Sub Public Function DecodeUrl(ByVal strUrl As String) As String Dim HexCaracter As String() HexCaracter = strUrl.Split(CChar("%")) For I As Integer = 1 To HexCaracter.Length - 1 Dim Cr As String = HexCaracter(I).Substring(0, 2) Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16)) strUrl = strUrl.Replace("%" & Cr, newCr) Next Return strUrl End Function
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. #Region "Normalizar URL" Public Function NormalizarUrl(ByVal strUrl As String) As String strUrl = DecodeUrl(strUrl) Task.Factory.StartNew(Sub() If strUrl.Contains("www.google.es/url?") = True Then '//Obtiene la Url a la que redirecciona strUrl = ResolverUrlGoogle(strUrl) Else '//Si el Url redireciona a otra Url obtiene la Url a la que redirecciona strUrl = ResolverURL(strUrl) End If ComboBox1.Invoke(DirectCast(Sub() ComboBox1.Text = strUrl, MethodInvoker)) End Sub) Return strUrl End Function Public Function DecodeUrl(ByVal strUrl As String) As String Dim HexCaracter As String() HexCaracter = strUrl.Split(CChar("%")) For I As Integer = 1 To HexCaracter.Length - 1 Dim Cr As String = HexCaracter(I).Substring(0, 2) Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16)) strUrl = strUrl.Replace("%" & Cr, newCr) Next Return strUrl End Function Public Function ResolverUrlGoogle(ByVal strUrl As String) As String Dim uri As New Uri(strUrl) Dim dirs As String = uri.GetComponents(UriComponents.AbsoluteUri, UriFormat.UriEscaped) Try Dim dirArray As String() = dirs.Split(CChar("=")) For I As Integer = 1 To dirArray.Length - 1 If dirArray(I).Length > 4 Then If dirArray(I).Substring(0, 4) = "http" Then strUrl = dirArray(I).Replace("&usg", "") Exit For End If End If Next Catch ex As Exception End Try Return strUrl End Function Public Function ResolverURL(ByVal strUrl As String) As String Dim RedirectUrl As String = Nothing strUrl = DecodeUrl(strUrl) Try Dim WebRequest As System.Net.HttpWebRequest = DirectCast(System.Net.HttpWebRequest.Create(strUrl), System.Net.HttpWebRequest) With WebRequest WebRequest.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1" 'WebRequest.MaximumAutomaticRedirections = 1 WebRequest.AllowAutoRedirect = True '<==importante End With Using webResponse As System.Net.HttpWebResponse = DirectCast(WebRequest.GetResponse, Net.HttpWebResponse) RedirectUrl = webResponse.ResponseUri.AbsoluteUri webResponse.Close() '<===importante End Using Catch ex As System.Net.WebException If ex.Status = Net.WebExceptionStatus.NameResolutionFailure Then MessageBox.Show("El Sitio no existe", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) End If End Try Return RedirectUrl End Function #End Region
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 molestiasHe añadido por ejemplo esta función: Public Function DecodeUrl(ByVal strUrl As String) As String Dim HexCaracter As String() HexCaracter = strUrl.Split(CChar("%")) For I As Integer = 1 To HexCaracter.Length - 1 Dim Cr As String = HexCaracter(I).Substring(0, 2) Dim newCr As String = Convert.ToChar(Convert.ToInt32(Cr, 16)) strUrl = strUrl.Replace("%" & Cr, newCr) Next Return strUrl 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
Mensajes: 9.878
|
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: Imports System.Web 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" Dim decoded As String = HttpUtility.UrlDecode(encoded) 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: Imports System.Web 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" Dim urlValue As String = HttpUtility.ParseQueryString(googleQuery).Item("url") 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: ''' ---------------------------------------------------------------------------------------------------- ''' <summary> ''' Redirects an Url that points to other Url. ''' </summary> ''' ---------------------------------------------------------------------------------------------------- ''' <example> This is a code example. ''' <code> ''' Dim url As String = "http://goo.gl/PsCZN4" ''' Dim redirect As String = RedirectUrl(url, count:=1) ''' </code> ''' </example> ''' ---------------------------------------------------------------------------------------------------- ''' <remarks> ''' Url redirection, also called Url forwarding, ''' is a World Wide Web technique for making a web page available under more than one Url address. ''' <para></para> ''' When a web browser attempts to open a Url that has been redirected, a page with a different Url is opened. ''' </remarks> ''' ---------------------------------------------------------------------------------------------------- ''' <param name="url"> ''' The Url to redirect. ''' </param> ''' ''' <param name="count"> ''' The amount of times to redirect the redirected Url. ''' </param> ''' ---------------------------------------------------------------------------------------------------- ''' <returns> ''' The resulting Url. ''' </returns> ''' ---------------------------------------------------------------------------------------------------- <DebuggerStepThrough> Public Shared Function RedirectUrl(ByVal url As String, Optional ByVal count As Integer = 1) As String Dim request As WebRequest For x As Integer = 0 To (count - 1) request = HttpWebRequest.Create(url) Using response As WebResponse = request.GetResponse If response.ResponseUri.AbsoluteUri.Equals(url) Then Exit For Else url = response.ResponseUri.AbsoluteUri End If End Using Next x Return url End Function
Ejemplo de uso: Imports Elektro.Net.Tools.NetworkUtil ' http://plixid.com/2016/01/20/megadeth-dystopia-2016-mp3/ Dim complexUrl As String = "http://r.plixid.com/r/CJ6o5x_DZIPnJTlA2uzJv1VBzYRa1dadJROc05Qi5lu018wnr2bc1NW28GpKRu5zoOarRCnvEEhbbH_lEivAn3-tA3AK2fzw7TvVj2PWnI9yctnTHr3D0OnmyrlrgVJ5eN8Ff3CIbIeEGkrZPmbacA.." Dim redirectedUrl As String = RedirectUrl(complexUrl, 1) 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
Mensajes: 268
|
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
Mensajes: 9.878
|
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
Mensajes: 268
|
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 DISPONIBLESystem.Web.dll 4.6.81.0 System.Web.httpUtility NO DISPONIBLESystem.Web.dll 4.0.30319.1 System.Web.httpUtility NO DISPONIBLESystem.Web.dll 2.0.50727.4016System.Web.httpUtility DISPONIBLESystem.Web.dll 2.0.50727.4205System.Web.httpUtility DISPONIBLEQue 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 . 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
Mensajes: 9.878
|
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 ). 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: 973c796405f02590a786c0f1b6173112e73bcdf2Puedes 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
Mensajes: 268
|
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: 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.30319v2.0.50727 contiene un archivo System.Web.dll el cual SI me carga la clase System.web.HttpUtility 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 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
Mensajes: 268
|
...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
Mensajes: 9.878
|
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: ''' ---------------------------------------------------------------------------------------------------- ''' <summary> ''' Encodes a Url string. ''' </summary> ''' ---------------------------------------------------------------------------------------------------- ''' <remarks> ''' For more info, see Percent-encoding rule specifications: ''' <para></para> ''' In English: <see href="http://en.wikipedia.org/wiki/Percent-encoding"/> ''' <para></para> ''' In Spanish: <see href="http://es.wikipedia.org/wiki/C%C3%B3digo_porciento"/> ''' </remarks> ''' ---------------------------------------------------------------------------------------------------- ''' <example> This is a code example. ''' <code> ''' Dim encoded As String = UrlEncode("http://www.website.com/page.asp?id=5&test=Hello World") ''' </code> ''' </example> ''' ---------------------------------------------------------------------------------------------------- ''' <param name="url"> ''' The Url to encode. ''' </param> ''' ---------------------------------------------------------------------------------------------------- ''' <returns> ''' The resulting encoded Url. ''' </returns> ''' ---------------------------------------------------------------------------------------------------- <DebuggerStepThrough> Public Shared Function UrlEncode(ByVal url As String) As String ' HttpUtility.UrlEncode() writes the percent-code in lower-case, ' this is a custom method to write the percent-code in upper-case. Const Excluded As String = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.!()*" Dim sb As New StringBuilder() For Each c As Char In url Select Case c Case " "c sb.Append("+"c) Case Else If (Excluded.Contains(c, EqualityComparer(Of Char).Default)) Then sb.Append(c) Else For Each value As Byte In Encoding.UTF8.GetBytes(c) sb.AppendFormat("%{0:X2}", value) Next value End If End Select Next c Return sb.ToString() 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
|
|
|
|
|
|