1

現在、悪い古いスパゲティ コード ファッションで直接使用されるレコードセット オブジェクトを使用して、従来の (古い) ASP Web ページを実行しています。

管理性を向上させるために、web サービスとして asp.net にデータ層を実装することを考えています。これは、web サイトを asp.net にアップグレードするための最初のステップでもあります。サイト自体は今のところ ASP のままです...

レコードセット オブジェクト タイプを Web サービスと互換性のあるタイプ (配列など) に置き換える良い方法を推奨できる人はいますか? 以下は何に置き換えますか?:

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

また、複数のレコードセットを置き換えることができますか? 私は話している:

 set objRS = objRs.nextRecordset 

誰もこれを経験し、お勧めできますか?

@AdditionalInfo - あなたはそれを求めました:-)

最初から始めましょう。 既存の状況は次のとおりです。ストアドプロシージャを介してデータベースから引き出された従来の階層コンテンツ(ヘッダー、セクション、サブセクション、コンテンツ)を含む古いASP Webサイトがあり、コンテンツページもデータベースにあります(htmlファイルへのリンク)。

ここで悪いことに、ASP コードはどこにでも多くの .asp ファイルに広がり、すべて独自のデータベース接続、読み取り、書き込みを行っています (コンテンツを登録する必要があります)。最近、SQL インジェクション攻撃の問題が発生したため、その修正を依頼されました。

SQL インジェクションを防ぐためにすべての .asp ページを変更することもできますが、それは狂気の沙汰ですだから私はデータ層を構築すると思った - この層を使用してデータベースにアクセスするすべてのページ。データベースアクセスコードを修正して更新する場所。

その決定に至って、asp.net のアップグレードは遠く離れていると思いました。データ層に asp.net を使い始めてみませんか? このようにして、サイトをアップグレードするときに再利用できます。

それは私を上記の質問に導きます!

4

7 に答える 7

4

まず、今週の私のお気に入りのアドバイスは、Web サービスをローカル オブジェクトのように扱わないことです。基本的に、Web アプリケーションで次のようなことをしないでください。

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

Web サービス (および SQL) への呼び出しを常に最小限に抑える必要があります。

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

Web サービスの呼び出しに使用するデータ型に関しては、基本的に次の 2 つの選択肢があります。

  • データセット
  • その他すべて (配列)

Web サービスから返されるほとんどのコレクション (List<MyData> など) は、実際には Web サービスの呼び出し中に配列に変換されます。Web サービスはオブジェクト (データ + 動作) を返すのではなく、データ構造 (または一連のデータ) のみを返すことに注意してください。したがって、List と Array の間にはほとんど違いはありません。

DataSet はより複雑なクラスです。それらは独自のカスタム シリアライザーを使用し、呼び出し元のアプリケーションでほぼ完全に再作成されます。このような DataSet を使用するとパフォーマンスにコストがかかるため、通常、ほとんどのシナリオではお勧めしません。配列を使用してデータをやり取りする方が効率的である傾向があり、率直に言って簡単です。

あなたの場合は少し異なります。既に ADO を使用している既存のサイトを変換しているため、ADO.NET DataSet が最適なアップグレード パスである可能性があります。ADO.NET と ADO はよく似ているため、直接更新する方が簡単かもしれません。Web サイトの構築方法によって異なります。

質問の最後の部分では、DataSet は ADO の Recordset に似た複数のレコードセットをサポートしています。それらは DataTable と呼ばれます。すべての DataSet には少なくとも 1 つの DataTable があり、任意の順序で読み取ることができます。

幸運を。

于 2008-09-10T21:26:16.517 に答える
1

クラシックASPを使い続けたい場合は、ASPクラスを介してデータベース処理オブジェクトを作成し、そのオブジェクトを使用してレコードセットを作成することをお勧めします。これにより、データベース処理コードが一元化され、SQLインジェクション攻撃を1か所で処理するだけで済みます。

簡単な例。

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

次に、これを使用するには、呼び出しを次のように変更します。

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

もちろん、基本クラスを拡張して、パラメーター化されたストアドプロシージャを処理したり、検証を追加したりすることもできます。

于 2008-09-16T18:56:44.110 に答える
1

ASP コードで XmlHttp クラスを使用することをお勧めします。

MyService.asmx に、次のような ASMX Web サービスがあるとします。

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

ASP では次のように呼び出すことができます。

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 は、次の XML 応答になります。

<string>Hello World</string>

サービスがデータのコレクションを返したと仮定すると、XPath またはその他の XML 処理技術/ライブラリを使用して、それを反復処理できます。

MSXML2 について調べてみると、ASP クラシックに固有のものであるため、おそらく特定の質問に答えることができます。

于 2008-09-10T21:40:51.770 に答える
1

もう 1 つの方法は、COM 相互運用機能を使用して、従来の ASP から呼び出し可能な .NET でアセンブリを作成することです。

Visual Studio (Microsoft Visual C# 2005 Express Edition など) から COM Interop アセンブリを作成するには:

  • 新しいクラス ライブラリ プロジェクトを作成する
  • プロジェクトのプロパティを開く

    • [アプリケーション] で [アセンブリ情報...] を選択し、[アセンブリを COM 可視にする] を有効にします。
    • [署名] の下で、[アセンブリに署名し、既存の厳密な名前のキー ファイルを作成または選択します] を有効にします。
  • ライブラリを作成してビルドする

    • COM 相互運用クラスには既定のコンストラクターが必要であり、非静的クラスとメソッドのみが公開されます
  • .dll を目的のフォルダー/マシンにコピーします。

  • RegAsm を使用して COM 用の .dll を登録します。

例 (必要に応じて調整):

"C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe" "C:\path\to\assembly.dll" /tlb /codebase
  • ASP からアセンブリを呼び出す

例 (必要に応じて調整):

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

ノート:

  • アセンブリは、更新時に RegAsm を介して再登録する必要があります

以下も参照してください。

于 2008-09-17T04:07:27.250 に答える
1

残念ながら、2008 年にこの質問を見ていませんでした。あなたのサイトは Justa フレームワークを使用しているようです。簡単な方法は、検索とデータ入力を urlencode に送信するための Justa コードを変更することです。私はそれをやり、私にとって完璧に機能しました。

コードの残りの部分は、SQL インジェクションやその他のデータベースへの侵入を防ぐのに十分なほど安全です。

于 2011-01-22T15:30:07.730 に答える
1

SQL インジェクションは、パラメーター化された SQL クエリを使用して処理する必要があります。これにより、セキュリティ リスクが排除されるだけでなく、実行計画を毎回再計算する代わりに再利用できるため、データベースのパフォーマンスが大幅に向上します。文字列の置換によってそれを処理するという提案はばかげています。VB は文字列の処理が苦手で、これらの "replace" ステートメントはパフォーマンスとメモリに非常にコストがかかります (また、実際には ' 文字のみを処理する必要があります)。

コードを .net に移動しても改善されません。ページに db コードを含めることは悪くありません。特に、数人の開発者しかいない小さなサイトについて話している場合. 何千ものサイトがこの手法を使用して、膨大な数のトランザクションを処理しています。現在、パラメータ化されていない動的SQLは悪いので、それを排除するために作業する必要がありますが、それを行うためにアプリまたは.netを書き直す必要はありません. 人々が .net を自分のアプリの事実上の改善と見なしている理由を常に知りたいと思っています。COM モデルに存在する悪いコードと悪い習慣のほとんどは、変換中に伝播するだけです。

真にまとまりがあり、最小限に結合された OO 設計を作成することにコミットする必要があります。または、それほど悪くないので、今行っていることを続けてください。

于 2008-09-21T06:14:05.077 に答える
1

レイヤーで考えるのではなく、アプリケーションを縦にスライスして .net に変換してみませんか。そうすれば、ばらばらな部分ではなく、.net でコード化された機能全体を取得できます。ユーザー エクスペリエンスを改善したり、機能を追加したりせずに、完全に機能するコードを置き換えることのビジネス上の価値は何ですか?

また、直接 ado を呼び出すよりも Web サービスを使用することであきらめるパフォーマンスのトレードオフを考慮することもできます。Web サービスは、共通のスキーマにアクセスする複数のバラバラなアプリケーション/チームの問題に対する優れたソリューションです。単一の分離されたアプリケーションの保守性が向上するわけではなく、遅く複雑になるだけです。

于 2008-09-11T00:59:45.287 に答える