Domanda

Attualmente ho un classico (vecchio) ASP pagina web con oggetto recordset utilizzato direttamente in cattivo vecchio spagethi codice fasion.

Sto pensando di attuare un livello di dati in asp.net come web serivce per migliorare la gestibilità.Questo è anche un primo passo verso l'aggiornamento del sito web per asp.net.Il sito rimane ASP per il momento...

Qualcuno può consigliare un buon modo di sostituire l'oggetto recordset di tipo con un servizio web di tipo compatibile (come un array o qualcosa del genere)?Che cosa posso sostituire al di sotto di con?:

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

e anche mutliple recordset può essere sostituito con?Sto parlando :

 set objRS = objRs.nextRecordset 

Qualcuno è andato attraverso questo e può consigliare?

@AdditionalInfo - si chiedeva :-)

Permettetemi di cominciare dall'inizio.La Situazione esistente è:Ho un vecchio sito web con ASP classico gerarchiche di contenuti (intestazione, sezione, sottosezione, contenuto) estratto del database tramite stored procedure e pagine di contenuti in database anche un link al file html).

Ora la cosa brutta è, il codice di ASP ovunque si sviluppa su molti .file asp in tutte le loro connessioni al database, la lettura, la scrittura (u, a registrare per il contenuto).Di recente abbiamo avuto problemi con attacchi di tipo SQL injection così sono stato chiamato per risolvere il problema.

Io potrebbe andare a cambiare tutto .le pagine asp per evitare sql injection, ma che sarebbe una follia.Così ho pensato di costruire un livello di dati - tutte le pagine utilizzando questo livello di database di access.Una volta per sistemare e aggiornare il db codice di accesso.

Venendo alla decisione che ho pensato asp.net l'aggiornamento non è'f lontano, perché non iniziare a utilizzare asp.net per lo strato di dati?In questo modo si può essere ri-utilizzati per l'aggiornamento del sito.

Che mi porta alle domande di cui sopra!

È stato utile?

Soluzione

Se si voleva attaccare con ASP Classico, quindi vorrei suggerire la creazione di un Database di gestione oggetto tramite ASP Classi quindi basta usare quella oggetto recordset creazioni.Questo sarebbe centralizzare la gestione di database di codice e fare in modo che avete solo per gestire attacchi di tipo SQL Injection in un unico luogo.

Un semplice esempio.

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

Quindi utilizzare questo cambierebbe le chiamate:

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

Naturalmente, è possibile espandere la classe di base per gestire la parametrizzazione stored procedure o cosa non e ulteriori convalide etc.

Altri suggerimenti

Prima la mia preferita consigli di questa settimana:non trattare il vostro Servizio Web come se fosse un oggetto locale o si sta andando a pagare un pesante prestazioni prezzo.In sostanza, non fanno le cose come questo nella vostra applicazione web:

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

Si dovrebbe sempre preferire per ridurre al minimo le chiamate per il Servizio Web (e SQL):

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

Ora, per quanto riguarda il tipo di dati da utilizzare per le chiamate di servizio web, fondamentalmente hai due scelte:

  • Set di dati
  • Tutto il resto (Array)

Più collezioni tornato da un servizio web (come un Elenco<MyData>effettivamente convertire un Array durante il Servizio Web invocazione.Ricordate che i Servizi Web di non restituire gli oggetti (dati + comportamento), ma proprio in strutture di dati (o una sequenza di).Quindi, c'è poca distinzione tra un Elenco e una Matrice.

I dataset sono più complesse classi;utilizzare il proprio serializzatore personalizzato e praticamente ottenere completamente ricreato in applicazione chiamante.C'è un costo in termini di prestazioni per essere pagati per l'utilizzo di set di dati, così io di solito non lo consiglio per la maggior parte degli scenari.L'uso di matrici per passare i dati avanti e indietro tende ad essere più efficiente, e francamente è più facile da fare.

Il tuo caso è un po ' diverso;perché la conversione di un sito esistente che già utilizza ADO, una ADO.NET set di dati potrebbe essere il vostro migliore updgrade percorso.ADO.NET e ADO sono abbastanza simili che un dritto aggiornamento potrebbe essere più facile in questo modo.Che tipo di dipende da come il vostro sito web è costruito.

Per l'ultima parte della tua domanda, i set di dati non supportano più recordset simile al Recordset ADO.Essi sono chiamati Datatable.Ogni set di dati ha almeno un DataTable e si può leggere in qualsiasi ordine.

Buona fortuna.

Suggerirei XmlHttp classe nel codice ASP.

Supponendo che si dispone di un servizio web ASMX simile a questo, in MyService.asmx:

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

Si potrebbe chiamare in ASP qualcosa di simile a questo:

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 sarebbe una risposta XML di:

<string>Hello World</string>

Supponendo che il vostro servizio ha restituito un insieme di dati, è possibile scorrere su di esso utilizzando XPath o qualsiasi altro XML tecnica di lavorazione/libreria.

Googling intorno MSXML2 probabilmente rispondere a domande specifiche, si hanno, dal momento che è specifico di ASP classico.

Invece di pensare a strati, perché non provare a prendere fette verticali attraverso l'applicazione e la conversione di quelli .net.In questo modo si arriva intere funzioni codificato .netto invece di disgiunto parti.Qual è il valore di business in sostituzione perfettamente funzionante codice senza migliorare l'esperienza dell'utente o l'aggiunta di funzionalità?

Si potrebbe anche prendere in considerazione il trade-off di prestazioni si sta andando a dare un Servizio Web diretta chiamate ado.I Servizi Web sono una buona soluzione per il problema di più disgiunti applicazioni/squadre accesso a uno schema comune;non un singolo e isolato applicazione più gestibile, solo più lento e più complesso.

Un'altra alternativa è quella di utilizzare l'Interoperabilità COM per creare un assembly in .NET che è richiamabile da ASP classico.

Per creare un assembly di Interoperabilità COM di Visual Studio (ad es.Microsoft Visual C# 2005 Express Edition):

  • Creare un nuovo progetto Libreria di classi
  • Aprire le proprietà del progetto

    • In Applicazione di selezionare le istruzioni di Montaggio...e abilitare l'opzione "Fare assieme COM-Visibile"
    • Sotto la Firma di attivare Firmare l'assembly e creare o selezionare un forte nome del file della chiave
  • Scrivere e costruire la biblioteca

    • L'Interoperabilità COM classi deve avere un costruttore di default e non statico classi e i metodi che vengono pubblicati
  • Copiare il .dll nella cartella desiderata/macchina

  • Registrare il .dll COM utilizzando RegAsm

Per esempio (regolare come necessario):

"C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" "C:\path\to\assembly.dll" /tlb /codebase
  • Convocazione l'assemblea da ASP

Per esempio (regolare come necessario):

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

Nota:

  • l'assemblea deve essere ri-registrato tramite RegAsm quando è aggiornato

Vedere anche:

Sql injection dovrebbe essere gestite tramite parametrizzazione query sql.Non solo questo ci permetterà di eliminare il rischio per la sicurezza, ma sarà velocizzare notevolmente le prestazioni del database, perché sarà in grado di riutilizzare un piano di esecuzione, invece di recalcing ogni volta.Il suggerimento di gestire attraverso la stringa di sostituzioni è sciocco.VB è terribile manipolazione di stringhe e quelli di "sostituire" le dichiarazioni potranno essere estremamente costoso in termini di prestazioni e memoria (anche, è in realtà solo bisogno di gestire il carattere ' (in ogni caso)

Spostare il codice per .net non lo fanno meglio.Avendo db codice nelle vostre pagine non è male;soprattutto se l'id si sta parlando di un piccolo sito con solo un paio di sviluppatori.Migliaia di siti utilizzano la tecnica di processo bazillions di dollari in transazioni.Ora, unparameterized sql dinamico è male e si dovrebbe lavorare per eliminare, ma che non richiede una riscrittura dell'app o del .net per farlo.Io sono sempre curioso di sapere perchè le persone a vedere .net come de facto miglioramento per la loro applicazione.La maggior parte del male del codice e le cattive abitudini che esisteva nel COM solo modello di propagazione in avanti durante la conversione.

Hai bisogno di fare un impegno per la creazione di un vero e coeso minimamente accoppiato, OO design;o solo quello che hai andando, perché non è così male.

Peccato non ho visto questa domanda nel 2008.Mi sembra che il tuo sito utilizza Justa quadro.Semplice è quello di modificare Justa codice per invio di ricerca e di dati di input per urlencode.Io l'ho fatto e funziona perfettamente per me.

Il resto del codice è abbastanza sicuro per evitare qualsiasi tipo di os iniezioni SQL o altro tentativo di entrare nel database.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top