Pregunta

Actualmente corro un clásico (antiguo) ASP página web con el objeto de conjunto de registros se utiliza directamente en los viejos spagethi código fasion.

Estoy pensando en la aplicación de una capa de datos en asp.net como web services para mejorar la manejabilidad.Este es también un primer paso hacia la actualización de la página web para asp.net.El sitio en sí sigue siendo ASP, por el momento...

¿Alguien puede recomendar una buena forma de reemplazar el objeto recordset de tipo con un servicio web de tipo compatible (como un array o algo)?¿Qué puedo reemplazar a continuación con?:

set objRS = oConn.execute(SQL)
while not objRS.eof
   ...
   name = Cstr(objRS(1))
   ...
wend

y también varios conjuntos de registros puede ser sustituida?Estoy hablando :

 set objRS = objRs.nextRecordset 

Nadie fue a través de este y puede recomendar?

@AdditionalInfo - usted lo pidió :-)

Permítanme empezar por el principio.La Situación actual es:Yo tengo un viejo sitio web con ASP clásico hierachical contenido (encabezado, sección, subsección, contenido) sacó de la base de datos a través de procedimientos almacenados y el contenido de las páginas están en la base de datos también (un enlace a un archivo html).

Ahora lo malo, es, código ASP en todas partes extendió a lo largo de muchos .los archivos asp todos haciendo sus propias conexiones de base de datos, la lectura, la escritura (u tiene que registrarse para el contenido).Recientemente hemos tenido problemas con los ataques de inyección SQL por lo que fue llamado a arreglar.

Yo podría ir a cambiar todos los .las páginas asp para evitar la inyección sql, pero eso sería una locura.Así que pensé en crear una capa de datos - todas las páginas utilizando esta capa de acceso a base de datos.Una vez lugar a la revisión y actualización de db código de acceso.

Llegando a esa decisión que pensé asp.net la actualización no'f lejos, ¿por qué no empezar a usar asp.net para la capa de datos?De esta manera se puede volver a actualizar el sitio.

Eso me lleva a las preguntas de arriba!

¿Fue útil?

Solución

Si quería seguir con ASP Clásico, a continuación, me permito sugerir la creación de una Base de datos de la manipulación de objetos a través de ASP Clases, a continuación, sólo utilizar ese objeto para hacer su juego de registros creaciones.Este sería centralizar la base de datos de manejo de código y hacerlo de modo que usted sólo tiene que manejar los ataques de Inyección SQL en un solo lugar.

Un ejemplo sencillo.

Class clsDatabase

    Private Sub Class_Initialize()
        If Session("Debug") Then Response.Write "Database Initialized<br />"
    End Sub

    Private Sub Class_Terminate()
        If Session("Debug") Then Response.Write "Database Terminated<br />"
    End Sub

    Public Function Run(SQL)
        Set RS = CreateObject("ADODB.Recordset")
        RS.CursorLocation = adUseClient
        RS.Open SQLValidate(SQL), Application("Data"), adOpenKeyset, adLockReadOnly, adCmdText
        Set Run = RS
        Set RS = nothing
    End Function

    Public Function SQLValidate(SQL)
        SQLValidate = SQL
        SQLValidate = Replace(SQLValidate, "--", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, ";", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, "SP_", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, "@@", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " DECLARE", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, "EXEC", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " DROP", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " CREATE", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " GRANT", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, " XP_", "", 1, -1, 1)
        SQLValidate = Replace(SQLValidate, "CHAR(124)", "", 1, -1, 1)
    End Function
End Class

A continuación, el uso de este se puede cambiar de llamadas:

Set oData = new clsDatabase
Set Recordset = oData.Run("SELECT field FROM table WHERE something = another")
Set oData = nothing

Por supuesto, usted puede ampliar la clase básica para manejar parametrizadas procedimientos almacenados o lo que no y más validaciones, etc.

Otros consejos

Primero mi favorito consejo de esta semana:no tratar su Servicio Web como si de un objeto local o usted va a pagar muy fuerte rendimiento precio.Esencialmente, no hago cosas como esta en la aplicación web:

MyDataWebService ws = new MyDataWebService();
foreach(DataItem item in myData)
{
    ws.Insert(item);
}

Siempre se debe preferir las llamadas a su Servicio de internet (y SQL):

MyDataWebService ws = new MyDataWebService();
ws.Insert(myData); // Let the web service process the whole set at once.

Ahora, en cuanto al tipo de datos a utilizar para sus llamadas de servicio web, básicamente tienes dos opciones:

  • Conjunto de datos
  • Todo lo demás (Matriz)

La mayoría de las colecciones de regresar de un servicio web (como una Lista<MyData>), en realidad, convertir a una Matriz durante la invocación de Servicios Web.Recuerde que los Servicios Web no devolver los objetos (datos + comportamiento), pero sólo las estructuras de datos (o una secuencia de ellos).Por lo tanto, hay poca distinción entre una Lista y una Matriz.

Los conjuntos de datos son más complejos de las clases;ellos utilizan su propia serializador personalizado y bastante obtendrá totalmente recreado en la aplicación de llamada.Hay un costo en rendimiento a ser pagado por el uso de conjuntos de datos como eso, así que no me la recomiendan para la mayoría de los escenarios.La utilización de matrices para pasar los datos de ida y vuelta tiende a ser más eficiente, y, francamente, es más fácil de hacer.

Su caso es un poco diferente;porque usted es la conversión de un sitio existente que ya se utiliza ADO, un ADO.NET conjunto de datos puede ser su mejor updgrade camino.ADO.NET y ADO son lo suficientemente similares como para que una recta actualización podría ser más fácil de esa manera.Que tipo de depende de cómo su sitio web se construye.

Para la última parte de su pregunta, los conjuntos de datos no apoyan varios conjuntos de registros similares a los de ADO Recordset.Se llaman tablas de datos.Cada conjunto de datos tiene al menos un DataTable y se pueden leer en cualquier orden.

La buena suerte.

Me gustaría sugerir el uso de la XmlHttp clase en el código ASP.

Asumiendo que usted tiene un servicio web ASMX similar a esta, en MyService.asmx:

[WebMethod]
public string HelloWorld()
{
  return "Hello World";
}

Se le podría llamar en ASP algo como esto:

Dim xhr

Set xhr = server.CreateObject("MSXML2.XMLHTTP")

xhr.Open "POST", "/MyService.asmx/HelloWorld", false
xhr.SetRequestHeader "content-type", "application/x-www-form-urlencoded"
xhr.Send

Response.Write(xhr.ResponseText)

ResponseText sería una respuesta XML de:

<string>Hello World</string>

Suponiendo que el servicio devuelve una colección de datos, se puede iterar sobre ella usando XPath o cualquier otro procesamiento de XML técnica/biblioteca.

El google acerca de MSXML2 probablemente va a responder a cualquier pregunta específica que usted tiene, ya que es específico para ASP clásico.

En lugar de pensar en capas, ¿por qué no tratar de tomar vertical corta a través de la aplicación y la conversión de aquellos a los .net.De esa manera usted obtendrá toda la características codificado .red en lugar de partes disjuntas.¿Cuál es el valor de negocio en sustitución perfectamente código de trabajo, sin mejorar la experiencia de usuario o la adición de características?

También podría considerar el trade-off de rendimiento que va a dar con un Servicio Web a través de directo ado llamadas.Los Servicios Web son una buena solución para el problema de las múltiples discontinuo aplicaciones/equipos de acceder a un esquema común;no hacen un único y aislado de la aplicación más fácil de mantener, sólo más lento y más complejo.

Otra alternativa es el uso de la Interoperabilidad COM para crear un ensamblado de .NETA que se puede llamar desde ASP clásico.

Para crear un ensamblado de Interoperabilidad COM de Visual Studio (por ejemplo,Microsoft Visual C# 2005 Express Edition):

  • Crear un nuevo proyecto de Biblioteca de clases
  • Abra las propiedades del proyecto

    • En virtud de la Aplicación seleccione Información de la Asamblea...y activar la opción "Hacer de la asamblea COM-Visible"
    • Bajo la Firma de habilitar el Signo de la asamblea y crear o seleccionar una existente fuerte de clave de nombre de archivo
  • Escribir y construir la biblioteca

    • Interoperabilidad COM las clases deben tener un constructor por defecto y que no sólo las clases estáticas y métodos se publican
  • Copia el .dll a la carpeta deseada/máquina

  • Registrar el .dll de COM utilizando RegAsm

Por ejemplo (ajustar según sea necesario):

"C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" "C:\path\to\assembly.dll" /tlb /codebase
  • Llame a la asamblea de ASP

Por ejemplo (ajustar según sea necesario):

Dim obj, returnValue
Set obj = Server.CreateObject("MyProject.MyClass")
returnValue = obj.DoSomething(param1, param2)

Nota:

  • la asamblea debe volver a registrarse a través de RegAsm cuando se actualiza

Vea también:

La inyección de Sql debe ser manejado mediante parametrización de consultas sql.Esto no sólo elimina el riesgo de seguridad, pero va a aumentar significativamente la velocidad de su rendimiento de base de datos porque va a ser capaz de reutilizar un plan de ejecución en lugar de recalcing cada vez.La sugerencia de manejar a través de la cadena de sustituciones es absurdo.VB es terrible en el manejo de cadenas de caracteres y los de "reemplazar" las declaraciones serán extremadamente costoso en el rendimiento y la memoria (también, usted realmente sólo necesita para manejar el carácter ' de todos modos)

Código de movimiento para .neta no lo hace mejor.Teniendo db de código en sus páginas no es malo;especialmente si id estamos hablando de un sitio pequeño, con sólo un par de desarrolladores.Miles de sitios de utilizar esta técnica para el proceso de bazillions de dólares en transacciones.Ahora, unparameterized sql dinámico es mala, y usted debe trabajar para eliminar eso, pero que no requiere de una reescritura de la aplicación o el .net para hacerlo.Siempre estoy curioso por qué la gente ve .net como de facto de mejora para su aplicación.La mayoría de las malas código y de las malas costumbres que existían en el modelo COM sólo se propagan hacia adelante durante una conversión.

Usted necesita hacer un compromiso para la creación de una verdadera cohesión, mínimamente junto, OO diseño;o simplemente mantener lo que tienen, porque no todo es tan malo.

Lástima que no vi esta pregunta en 2008.Para mí se parece a tu sitio está utilizando Justa marco.Manera sencilla es modificar Justa código para enviar de búsqueda y entradas de datos para urlencode.Yo lo hice y funciona perfectamente para mí.

Resto del código de seguridad suficientes para evitar cualquier tipo os de las inyecciones de SQL o de otro intento de entrar en la base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top