lunes, 9 de septiembre de 2019

asp.net posible Se detectó un valor Request.Form potencialmente peligroso del cliente

En mi caso, cuando se ingresaba en una caja de texto de mi pagina web, valores como "< >" , se mostraba el mensaje: Se detectó un valor Request.Form potencialmente peligroso del cliente

una de las soluciones que encontré fue realizando lo siguiente:

1. En la pagina donde se encontraba mi control (caja de texto), agregar la siguiente propiedad:

 
<%@  Page EnableEventValidation="false" %>

2. Ademas de agregar en el archivo web.config:
 

   

jueves, 17 de enero de 2019

Convertir documento a Byte base64

Convertir Doc a Byte()

Public Shared Function convertirDoc_Byte(rutaArchivo As String) As Byte()
        Dim fileBytes = File.ReadAllBytes(rutaArchivo)
        Dim encodedFile = Convert.ToBase64String(fileBytes)

        Dim aa = System.Text.Encoding.Default.GetBytes(encodedFile)
        Return aa
    End Function

Convertir Byte() a Doc
Public Shared Sub convertirByte_doc(archBytes As Byte(),rutaArchivo As String)
        Dim base64String = System.Text.Encoding.Default.GetString(archBytes)
        Dim imageBytes As Byte() = Convert.FromBase64String(base64String)

        File.WriteAllBytes(rutaArchivo, imageBytes)

    End Sub

Saludos

Mostrar una Imagen desde una ruta compartida

A veces se desea mostrar una imagen desde una ruta externa a la aplicación. Una de las soluciones seria la siguiente:

aspx:
<asp:Image ID="ss" runat="server" />

VB:
Dim reader = File.ReadAllBytes("\\XXXX\YYYY\icon.png")
Dim image1 = New MemoryStream(reader)
ss.ImageUrl = "data:image/png;base64," + Convert.ToBase64String(image1.ToArray(), 0, image1.ToArray().Length)

Saludos

miércoles, 26 de septiembre de 2018

IIS ampliar maxAllowedContentLength

El límite de solicitudes en .Net se puede configurar desde dos propiedades juntas:

primero 
Web.Config/system.web/httpRuntime/maxRequestLength
Unidad de medida: kilobytes
Valor predeterminado 4096 KB (4 MB)
Max. valor 2147483647 KB (2 TB)

 Segundo Web.Config/system.webServer/security/requestFiltering/requestLimits/maxAllowedContentLength (en bytes)
Unidad de medida: bytes
Valor predeterminado 30000000 bytes (28.6 MB)
Max. valor 4294967295 bytes (4 GB)


Ejemplo:
   <system.web>
     <!--The default size is 4096 kilobytes (4 MB). MaxValue is 2147483647 KB (2 TB)-->
     <!-- 100 MB in kilobytes -->
     <httpRuntime maxRequestLength="102400" />
   </system.web>
   <system.webServer>
     <security>
       <requestFiltering>          
         <!--The default size is 30000000 bytes (28.6 MB). MaxValue is 4294967295 bytes (4 GB)-->
         <!-- 100 MB in bytes -->
         <requestLimits maxAllowedContentLength="104857600" />
       </requestFiltering>
     </security>
   </system.webServer>
Salusos.

martes, 25 de septiembre de 2018

AutoComplete con BootStrap y js

A continuación se muestra un ejemplo de autocomplete con bootstrap.

sección js:

    
    
    
    

    

controles del formulario:
 

  


codigo vb:
 
< webmethod > _
    Public Shared Function ListarComitente(obj As ComitenteBE) As List(Of ComitenteBE)
        Dim lista = New ComitenteDA().ListarComitente(obj) 'en esta sección obtener el listado desde la BD
        Return lista
    End Function

objeto con las propiedades necesarias:
 
< serializable >
Public Class ComitenteBE
    Public Property CodComitente As String
    Public Property Descripcion As String
End Class

Saludos

lunes, 20 de agosto de 2018

martes, 16 de mayo de 2017

maxlength en un textbox Multiline

una forma de hacerlo, es asignando el atributo al TextBox desde el código(vb). ejemplo:

CajitaDeTexto..Attributes("maxlength") = 255

jueves, 4 de mayo de 2017

TransactionScope - Timeout

El siguiente código tomará el valor de timeout por defecto (1 min.) para una nueva conexión (el valor de TransactionManager.DefaultTimeout):
 
Using tran As New Transactions.TransactionScope
tran.Complete()
End Using
Sin embargo, este otro código tomará el valor 0, que significa infinito (aunque recuerda que nunca podrá irse más allá del valor de maxTimeout (por defecto 10 min.) establecido en el machine.config).
 
Dim options As New TransactionOptions
Using tran As New TransactionScope(TransactionScopeOption.Required, options)
tran.Complete()
End Using

lunes, 17 de abril de 2017

Recorrer String con texto en XML

En este caso, se requiere agregar la información devuelta por un servicio a una lista de objetos:
xml devuelto por el servicio, almacenado en variable String "salida":
 

        JOSE LUIS                          
        BUGARIN                                 
        PECHE                                   
        19820424
        M
    
Recorremos los nodos del xml:
 
Dim listaResultado = New List(Of ObjetoBE)
Dim obj As New ObjetoBE
Dim xml As XDocument = XDocument.Parse(salida)
Dim resultadoXML = xml.Descendants("RESPUESTA")
If resultadoXML.Count > 0 Then
     For Each nodo As XElement In resultadoXML
        Dim Nnombre = nodo.Descendants("NOMBRES").FirstOrDefault
        obj .Nombres = IIf(IsNothing(Nnombre), "", Nnombre.Value.Trim)

        Dim NApePaterno = nodo.Descendants("APPAT").FirstOrDefault
        obj .ApePaterno = IIf(IsNothing(NApePaterno), "", NApePaterno.Value.Trim)

        Dim NApeMaterno = nodo.Descendants("APMAT").FirstOrDefault
        obj .ApeMaterno = IIf(IsNothing(NApeMaterno), "", NApeMaterno.Value.Trim)

        Dim NFechaNacimiento = nodo.Descendants("FENAC").FirstOrDefault
        obj .FechaNacimiento = IIf(IsNothing(NFechaNacimiento), "", NFechaNacimiento.Value.Trim)

        Dim NSexo = nodo.Descendants("SEXO").FirstOrDefault
        obj .Sexo = IIf(IsNothing(NSexo), "", NSexo.Value.Trim)
    Next

    listaResultado.Add(obj)
Else
    mensaje = "No devolvió resultados"
End If

Convertir una Imagen a Byte y Byte a Imagen

Las siguientes funciones convierten una imagen desde una ruta física a byte y viceversa...
 
Public Function ConvertirImagen_Byte() As Byte()
    Dim rutaImagen = "D:\Documentos\ImagenOrigen\s1.jpg"
    Using foto As FileStream = New FileStream(rutaImagen, FileMode.Open)
        Dim reader As BinaryReader = New BinaryReader(foto)
        Dim imagen(foto.Length) As Byte
        reader.Read(imagen, 0, Convert.ToInt32(foto.Length))
        Return imagen
    End Using
End Function


Protected Sub ConvertirByte_Imagen(ImgBytes As Byte())
    Dim ruta As String = "D:\Documentos\ImagenDestino\s1.jpg" 
    Dim ms As MemoryStream = New MemoryStream(ImgBytes)
    Dim imagen = New System.Drawing.Bitmap(ms)
    imagen.Save(ruta, System.Drawing.Imaging.ImageFormat.Jpeg)
End Sub

jueves, 23 de marzo de 2017

Alert() con salto de línea.

Muchas veces es necesario incluir en un alert varios mensajes de error, la siguiente solución esta planteada para vb.net y C# con Javascript.

VB.NET:
 
Dim strMensaje As String = ""
strMensaje += "- Ingrese texto A." + "\r\n"
strMensaje += "- Ingrese texto B." + "\r\n"
ScriptManager.RegisterStartupScript(Me, Me.GetType, "alerta", "alert('" & strMensaje & "');", True)

C#:
 
String strMensaje = "";
strMensaje += "- Ingrese texto A." + "\\n";
strMensaje += "- Ingrese texto B." + "\\n";
ScriptManager.RegisterStartupScript(this, this.GetType(), "alerta", "alert('" + strMensaje + "');", true);


Saludos.

lunes, 12 de diciembre de 2016

Gridview no se muestra a mayor cantidad de resultados

agregar lo siguiente en el appSettings del web.config:

<add key="aspnet:MaxHttpCollectionKeys" value="2147483647" />
<add key="aspnet:MaxJsonDeserializerMembers" value="2147483647" />

jueves, 13 de octubre de 2016

Web config en Servicio WCF

Hola a todos, al elaborar y publicar servicios WCF, muchas veces no recordamos que colocar en el config; por tal motivo les comparto un ejemplo básico de lo que debería contener:
 

  
    
  
  
    
    
  
  
    
      
        
        
        
          
            
          
        
      
    
    
      
        
          
          
        
      
    
    
      
        
          
          
        
      
    
  


Nota:
Al publicar tu servicio, se deberá modificar la url de la sección :
<add baseAddress="http://localhost:8732/Design_Time_Addresses/SMV.EncuestaSC.WCF/ServiceSC/" />
por la url que corresponda en el servidor web.

viernes, 22 de julio de 2016

COM Excel - Word error: 80070005 Acceso denegado IIS

En mi caso, mi aplicación al tratar de modificar un archivo excel me mostraba el siguiente error:

Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005 Access is denied.

la solución que encontré es lo siguiente:

a) Si la app se esta usando ApplicationPoolIdentity, realizar lo siguiente:
  • Presionar las teclas “Windows + R”; ingresar el texto dcomcnfg y presionar el botón Aceptar
  • Servicios de componentes -> Equipos -> Mi PC -> Configuración DCOM, buscar “Microsoft Excel Application” y seleccionar botón derecho propiedades.
  • En Pestaña Identidad, elegir la opción "El usuario interactivo"
  • En pestaña Seguridad, editar para todos los “Customize”, el usuario “IIS_IUSRS“ (si no lo encuentras, búscalo en localización: “Servidor” )

b) Si la app esta usando usuario de aplicación, otra opción sería realizar lo siguiente:
  • Presionar las teclas “Windows + R”; ingresar el texto dcomcnfg y presionar el botón Aceptar
  • Servicios de componentes -> Equipos -> Mi PC -> Configuración DCOM, buscar “Microsoft Excel Application” y seleccionar botón derecho propiedades.
  • En Pestaña Identidad, elegir la opción "Este Usuario" (colocar el usuario de aplicación)
(*) En caso no encuentren "Microsoft Excel Application", pueden probar ingresar a través de la ruta C: WINDOWSSysWOW64> mmc comexp.msc o ejecutando el siguiente comando: mmc comexp.msc /32

(*)Si es archivo word:
realizar los mismos pasos anteriores, pero buscar " Documento Microsoft Word " y / o " Aplicación Microsoft Word " o “Microsoft Word 97 -2003 Document” o algo que diga Word. si aun no encuentra buscar "{00020906-0000-0000-C000-000000000046}".







miércoles, 20 de julio de 2016

ImageButton error Sys.WebForms.PageRequestManagerServerErrorException

Hola..
Posiblemente al trabajar con ImageButton; se les presente el siguiente error:

Sys.WebForms.PageRequestManagerServerErrorException input string was not in a correct format

La solución que encontré después de buscar durante dias :'( fue agregar lo siguiente despues del tag HTML:

 

viernes, 10 de junio de 2016

Enviar correo con imágenes incrustadas

Hola a todos.
Por si alguna vez les piden que envíen correos con imágenes; acá les comparto una forma de poder realizarlo:

 
Public Sub CorreoNet(ByVal CorreoDestinatario As String, CorreoDestinatarioCopia As String, ByVal CorreoRemitente As String, ByVal Name As String, _
                     ByVal Asunto As String, ByVal Host As String)
        'Mensaje:
        Dim Mensaje = "Hola mundo... cargando imagen: "

        Dim reader = File.ReadAllBytes("D:\Demo\Imagenes\iGrupo.png")
        Dim image1 = New MemoryStream(reader)
        Dim av = AlternateView.CreateAlternateViewFromString(Mensaje, Nothing, System.Net.Mime.MediaTypeNames.Text.Html)

        Dim headerImage = New LinkedResource(image1, System.Net.Mime.MediaTypeNames.Image.Jpeg)
        headerImage.ContentId = "companyLogo"
        headerImage.ContentType = New Mime.ContentType("image/png")
        av.LinkedResources.Add(headerImage)

        'Configuracion Mensaje:
        Dim Correo = New Mail.MailMessage()
        Correo.To.Add(CorreoDestinatario)
        If Not CorreoDestinatarioCopia = "" Then Correo.CC.Add(CorreoDestinatarioCopia)
        Correo.From = New Mail.MailAddress(CorreoRemitente, Name, Encoding.UTF8)
        Correo.Subject = Asunto
        Correo.SubjectEncoding = Encoding.UTF8

        'Correo.Body = Mensaje
        Correo.AlternateViews.Add(av)
        Correo.BodyEncoding = Encoding.UTF8
        Correo.Priority = Mail.MailPriority.High
        Correo.IsBodyHtml = True

        'Configuracion SMTP:
        Dim Servidor = New Mail.SmtpClient
        Servidor.Host = Host

        'Enviar Correo:
        Try
            Servidor.Send(Correo)
        Catch ex As Mail.SmtpException
            Throw ex
        End Try
    End Sub
End Class

Ademas deberás incluir incluir los siguientes "Imports":
Imports System.Net
Imports System.Text
Imports System.IO
Imports System.Net.Mail
Saludos.

martes, 22 de marzo de 2016

GroupBy usando expresiones lambda

A continuación, voy a mostrarles como utilizar GroupBy con expresiones lambda. Para estos ejemplos se utilizará la siguiente lista:

Dim lista As New List(Of Object)
lista.Add(New With {.ANIO = 2014, .NUMERO = "1521", .SUELDO = 10})
lista.Add(New With {.ANIO = 2015, .NUMERO = "1521", .SUELDO = 20})
lista.Add(New With {.ANIO = 2015, .NUMERO = "1522", .SUELDO = 5})
lista.Add(New With {.ANIO = 2015, .NUMERO = "1522", .SUELDO = 5})

Caso 1: Agrupación por solo un campo + operador adicional
en el siguiente ejemplo se obtiene la suma de "Sueldos" por año.

Dim p1 = lista.GroupBy(Function(g) g.ANIO).Select(Function(a) New With {.numero = a.Key,
                                                                                    .sum = a.Sum(Function(p) p.SUELDO)}).ToList

Caso 2: Agrupación por varios campos + operador adicional
en el siguiente ejemplo se obtiene la suma de "Sueldos" por año y número.

Dim p2 = lista.GroupBy(Function(g) New With {Key g.ANIO, Key g.NUMERO}). _
                        Select(Function(a) New With {.anio = a.Key.ANIO,
                                                     .num = a.Key.NUMERO,
                                                     .sum = a.ToList.Sum(Function(p) p.SUELDO)}).ToList

Caso 3: Uso de GroupBy como reemplazo del Distinct
el siguiente ejemplo aplica el distinct sobre el campo: "ANIO":

Dim p3 = lista.GroupBy(Function(g) g.ANIO).Select(Function(a) a.First).ToList

en caso se tenga se tenga que aplicar varios campos se utilizará lo siguiente:

Dim p4 = lista.GroupBy(Function(g) g.ANIO And g.NUMERO).Select(Function(a) a.First).ToList

Saludos

miércoles, 11 de noviembre de 2015

Mensaje de confirmación

colocar lo siguiente en las propiedades del Button:

OnClientClick="javascript: return confirm('¿Esta seguro de eliminar la programación?');"

Saludos

Descomprimir ZIP

para que el código funcione, es necesario incluir referencia de Ionic.Zip.dll (puedes descargarla de aqui)

copiar el siguiente código:

 
Dim ZipAExtraer As String = ".../carpetaZip/compri.zip"
Dim DirectorioExtraccion As String = ".../CarpetaDatos/"
Using zip1 As ZipFile = ZipFile.Read(ZipAExtraer)
  Dim e As ZipEntry
  For Each e In zip1
    e.Extract(DirectorioExtraccion, ExtractExistingFileAction.OverwriteSilently)
  Next
End Using
Saludos

martes, 10 de noviembre de 2015

Ordenar GridView por Columna

La siguiente solución esta planteada para ordenar los datos de un GridView cuyo DataSource es cualquier lista de objetos o un DataTable, para lo cual utilizaremos un poco de Reflection. xD

Agregar método genérico:
 
Public Sub OrdenarGrilla(Of T)(grid As GridView, lista As List(Of T), campo As String, asc As Boolean)
   If Not String.IsNullOrWhiteSpace(campo) Then
       If asc Then
           lista = lista.OrderBy(Function(l) l.GetType().GetProperty(campo).GetValue(l, Nothing)).ToList()
       Else
           lista = lista.OrderByDescending(Function(l) l.GetType().GetProperty(campo).GetValue(l, Nothing)).ToList()
       End If
   End If
   grid.DataSource = lista
   grid.DataBind()
End Sub

este método puede ser utilizado en caso se tenga un DataTable y no una lista de objetos (por falta de tiempo lo dejo en C#).
 
public void OrdenarGrillaDt( GridView gv, DataTable dt, string campo, bool asc)
        {
            DataView dv = new DataView(dt);
            if (!string.IsNullOrWhiteSpace(campo))
            {
                string sortExp = campo + (asc == true ? " Asc" : " Desc");
                dv.Sort = sortExp;
            }
            dt = dv.ToTable();
            gv.DataSource = dt;
            gv.DataBind();
        }

El cual deberá utilizarse desde el evento Sorting del GridView. Ejemplo:
 
Protected Sub gvDocumentos_Sorting(sender As Object, e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles gvDocumentos.Sorting
    OrdenAsc1 = Not OrdenAsc1
    OrdenarGrilla(DirectCast(sender, GridView), listaDocumentos(), e.SortExpression, OrdenAsc1)
End Sub

Donde:
la variable OrdenAsc1 debe ser un ViewState("_OrdenAsc1_") que almacene el valor orden ascendente (true o false).ejemplo:
     Public Property OrdenAsc1() As Boolean
        Get
            If IsNothing(ViewState("_OrdenAsc1_")) Then
                Return True
            End If
            Return ViewState("_OrdenAsc1_")
        End Get
        Set(ByVal value As Boolean)
            ViewState.Add("_OrdenAsc1_", value)
        End Set
    End Property

Nota
El GridView debe de tener las propiedades AllowSorting="true" y SortExpression="colocar lo mismo que se coloca en la propiedad DataField". Ejemplo:
 

    
         
         
    
 

Saludos.