Frage

Derzeit betreibe ich eine klassische (alte) ASP-Webseite mit einem Recordset-Objekt, das direkt in der schlechten alten Spagethi-Code-Mode verwendet wird.

Ich denke darüber nach, eine Datenschicht in asp.net als Webdienst zu implementieren, um die Verwaltbarkeit zu verbessern.Dies ist auch ein erster Schritt zur Aktualisierung der Website auf asp.net.Die Seite selbst bleibt vorerst ASP...

Kann jemand eine gute Möglichkeit empfehlen, den Recordset-Objekttyp durch einen Webdienst-kompatiblen Typ (z. B. ein Array oder ähnliches) zu ersetzen?Womit ersetze ich unten?:

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

und auch mehrere Recordsets können durch ersetzt werden?Ich rede :

 set objRS = objRs.nextRecordset 

Hat das jemand durchgemacht und kann es empfehlen?

@AdditionalInfo - du hast danach gefragt :-)

Lassen Sie mich am Anfang beginnen.Bestehende Situation ist:Ich habe eine alte ASP-Website mit klassischen hierarchischen Inhalten (Kopfzeile, Abschnitt, Unterabschnitt, Inhalt), die über gespeicherte Prozeduren aus der Datenbank gezogen wurden, und Inhaltsseiten befinden sich ebenfalls in der Datenbank (ein Link zur HTML-Datei).

Das Schlimmste ist, dass der ASP-Code überall über viele .asp-Dateien verteilt ist und alle ihre eigenen Datenbankverbindungen herstellen, lesen und schreiben (Sie müssen sich für den Inhalt registrieren).Vor kurzem hatten wir Probleme mit SQL-Injection-Angriffen, also wurde ich gebeten, das Problem zu beheben.

ICH könnte Ändern Sie alle ASP-Seiten, um eine SQL-Injection zu verhindern, aber das wäre Wahnsinn.Also dachte ich mir, eine Datenschicht aufzubauen – alle Seiten nutzen diese Schicht, um auf die Datenbank zuzugreifen.Einmal Ort, um den Datenbank-Zugriffscode zu reparieren und zu aktualisieren.

Als ich zu dieser Entscheidung kam, dachte ich, dass ein asp.net-Upgrade nicht mehr weit ist. Warum nicht anfangen, asp.net für die Datenschicht zu verwenden?Auf diese Weise kann es bei der Aktualisierung der Site wiederverwendet werden.

Das bringt mich zu den obigen Fragen!

War es hilfreich?

Lösung

Wenn Sie mit klassischen ASP halten wollen, dann würde ich vorschlagen, ein Datenbank-Handling-Objekt über ASP-Klassen zu schaffen, dann benutzen Sie einfach das Objekt Recordset Kreationen zu tun. Dies würde Ihren Datenbank-Handling-Code zentralisiert und macht es so, dass Sie nur SQL-Injection-Angriffe in einem einzigen Standort haben zu behandeln.

Ein einfaches Beispiel.

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

Dann ist diese verwenden würden Sie Ihre Anrufe ändern:

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

Natürlich können Sie die Basisklasse erweitern, um parametrisierte gespeicherte Prozeduren oder was nicht und Validierungen usw.

Griff

Andere Tipps

Zuerst mein Liebling Beratung dieser Woche: nicht behandelt Ihren Web-Service, wie es, wenn ein lokales Objekt ist, oder Sie werden einen sehr kräftige Performance Preis zahlen. Im Wesentlichen nicht tun, Dinge wie dies in Ihrer Web-Anwendung:

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

Sie sollten immer lieben Anrufe auf Ihren Web Service zu minimieren (und SQL):

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

Nun, so weit wie der Datentyp für Ihre Web-Service-Anrufe zu verwenden, haben Sie grundsätzlich zwei Möglichkeiten:

  • DataSet
  • Alles andere (Array)

Die meisten Sammlungen von einem Webdienst zurückgegeben (wie eine List ) konvertieren tatsächlich zu einem Array während des Web-Service-Aufruf. Beachten Sie, dass Web Services keine Objekte zurück (Daten + Verhalten), sondern nur Datenstrukturen (oder eine Folge von). Daher gibt es wenig Unterschied zwischen einer Liste und einem Array.

Dataset sind komplexe Klassen; sie verwenden ihre eigenen Serializer und ziemlich viel bekommen vollständig in der rufenden Anwendung neu erstellt. Es ist eine kostengünstige Leistungs für die Verwendung von Datasets wie das bezahlt werden, so dass ich es in der Regel nicht für die meisten Szenarien empfehlen. Mit Arrays Daten passiert hin und her neigt, effizienter zu sein, und ehrlich gesagt ist es einfacher zu machen.

Ihr Fall ist ein bisschen anders; weil Sie eine bestehende Website konvertieren, die bereits ADO verwendet, kann ein ADO.NET DataSet Ihr bester updgrade Pfad sein. ADO.NET und ADO sind ähnlich genug, dass eine gerade Update könnte einfacher sein, auf diese Weise. Es Art abhängt, wie Sie Ihre Website erstellt wird.

Für den letzten Teil Ihrer Frage, Dataset mehr Cord-Sets ähnlich wie ADO Recordset unterstützen. Sie sind genannt Tables. Jeder Datensatz hat mindestens eine Datentabelle und Sie können sie in beliebiger Reihenfolge lesen.

Viel Glück.

Ich würde vorschlagen, die XmlHttp Klasse in Ihrem ASP-Code verwenden.

Angenommen, Sie einen ASMX Web-Service ähnlich wie diese, in MyService.asmx:

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

Sie es in ASP so etwas wie dies nennen könnte:

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)

Response wäre eine XML-Antwort von:

<string>Hello World</string>

Angenommen, Ihre Dienstleistung eine Sammlung von Daten zurückgegeben, Sie über sie iterieren könnten XPath oder andere XML-Verarbeitungstechnik / Bibliothek.

Googeln über MSXML2 um wahrscheinlich spezielle Fragen beantworten, die Sie haben, da es spezifisch ist zu klassischem ASP.

Statt in Schichten zu denken, warum nicht versuchen, vertikale Scheiben durch die Anwendung zu nehmen und diejenigen, .net zu konvertieren. Auf diese Weise werden Sie die gesamten Features in .net codiert bekommen statt disjunkte Teile. Was ist der Mehrwert perfekt funktionierenden Code zu ersetzen, ohne die Benutzerfreundlichkeit zu verbessern oder das Hinzufügen von Funktionen?

Sie können auch die Trade-off der Leistung betrachten Sie mit einem Web-Service über direkte ado Anrufe aufgeben werden. Web Services sind eine gute Lösung für das Problem von mehreren disjunkten Anwendungen / Teams ein gemeinsames Schema zuzugreifen; sie nicht eine einzelne isolierte Anwendung besser verwaltbar machen, nur langsamer und komplexer.

Eine weitere Alternative ist COM-Interop zu verwenden, um eine Montage in .NET zu erstellen, die von der klassischen ASP aufrufbar ist.

Um eine COM-Interop-Assembly von Visual Studio (zum Beispiel Microsoft Visual C # 2005 Express Edition) zu erstellen:

  • Erstellen Sie ein neues Klassenbibliotheksprojekt
  • die Projekteigenschaften öffnen

    • Unter Anwendung Assembly Informationen auswählen ... und aktivieren Sie "Make Montage COM-Visible"
    • Unter Signing ermöglicht die Montag Anmeldung und erstellen oder eine vorhandene starken Namen Schlüsseldatei auswählen
  • Schreiben und beim Aufbau der Bibliothek

    • COM-Interop-Klassen müssen über einen Standardkonstruktor verfügen und nur nicht-statische Klassen und Methoden veröffentlicht werden
  • die DLL in den gewünschten Ordner / Maschine Kopieren

  • Registrieren Sie die DLL für COM mit RegAsm

Zum Beispiel (bei Bedarf nachjustieren):

"C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" "C:\path\to\assembly.dll" /tlb /codebase
  • Rufen Sie die Montage von ASP

Zum Beispiel (bei Bedarf nachjustieren):

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

Hinweis:

  • die Baugruppe muss über RegAsm neu registriert werden, wenn es aktualisiert wird

Siehe auch:

SQL-Injektion sollte durch parametrisierte SQL-Abfragen behandelt werden. Dies wird nicht nur das Sicherheitsrisiko beseitigen, aber es wird Ihre Datenbankleistung erheblich beschleunigen, da es in der Lage sein wird, einen Ausführungsplan wiederverwenden statt recalcing es jedes Mal. Der Vorschlag, es durch String-Ersatz zu handhaben ist töricht. VB ist schrecklich bei Strings Handhabung und diese „ersetzen“ Aussagen werden in der Leistung und Speicher extrem teuer sein (auch, die Sie tatsächlich brauchen nur den "Charakter sowieso zu handhaben)

Verschieben von Code .net macht es nicht besser. db Code in Ihren Seiten zu haben, ist nicht schlecht; vor allem, wenn id Sie mit nur ein paar Devs über einen kleinen Ort sprechen. Tausende von Websites verwenden diese Technik bazillions von Dollar in Transaktionen zu verarbeiten. Nun unparameterized dynamische SQL ist schlecht und Sie sollten das beseitigen arbeiten, aber das bedeutet nicht eine Neufassung der App oder .net benötigen, es zu tun. Ich bin immer neugierig, warum die Leute .net als defacto Verbesserung ihrer App zu sehen. Die meisten der schlechten Code und schlechten Gewohnheiten, die nur in der COM-Modell existiert propagieren vorwärts während einer Umwandlung.

Sie müssen entweder eine Verpflichtung zur Schaffung eines wirklich zusammenhängende, minimal gekoppelt, OO-Design zu machen; oder einfach nur halten, was Sie haben zu gehen, weil es nicht so schlimm ist.

Schade, dass ich diese Frage nicht im Jahr 2008 gesehen habe. Für mich sieht es aus wie Ihre Website Justa Framework. Einfache Art und Weise ist Justa Code zu modifizieren, um Such- und Dateneingänge vorlegen urlencode. Ich habe es getan und arbeiten perfekt für mich.

Der Rest des Codes sicher genug jegliche Art o SQL-Injektionen oder anderen Versuch zu verhindern, in der Datenbank zu erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top