asp تستهلك خدمة ويب, ماذا تفعل مع كائن مجموعة السجلات?

StackOverflow https://stackoverflow.com/questions/55297

سؤال

أنا حاليا تشغيل الكلاسيكية (القديمة) ASP صفحة ويب مع كائن recordset استخدامها مباشرة في باد القديم spagethi رمز fasion.

أنا أفكر تنفيذ طبقة البيانات في asp.net كما ويب serivce لتحسين الإدارة.وهذا هو أيضا خطوة أولى نحو تطوير الموقع asp.net.الموقع نفسه لا يزال ASP لحظة...

أي شخص يمكن أن يوصي وسيلة جيدة استبدال كائن recordset نوع مع خدمة ويب متوافق نوع (مثل مجموعة أو شيء)?ماذا يمكنني استبدال أدناه؟:

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

و أيضا موتليبلي مجموعات السجلات يمكن استبدالها ؟ أنا أتحدث :

 set objRS = objRs.nextRecordset 

شخص ذهب من خلال هذا يمكن أن يوصي ؟

@AdditionalInfo - أنت من طلب هذا :-)

اسمحوا لي أن أبدأ من البداية.الوضع الحالي هو:لدي قديم ASP الموقع مع الكلاسيكية hierachical المحتوى (رأس, الفرع, القسم الفرعي, المحتوى) انسحبت من قاعدة البيانات عن طريق الإجراءات المخزنة و صفحات المحتوى في قاعدة البيانات أيضا (ارتباط إلى ملف html).

الآن الشيء السيء هو التعليمات البرمجية لـ ASP في كل مكان موزعة على العديد من .ملفات asp كل فعل بهم اتصالات قاعدة البيانات ، القراءة ، الكتابة (قد تضطر إلى التسجيل للحصول على المحتوى).مؤخرا كان لدينا مشاكل مع هجمات حقن SQL لذا كان يسمى لإصلاحه.

أنا يمكن أن تذهب تغيير كافة .صفحات asp لمنع حقن sql ولكن سيكون من الجنون.حتى ظننت بناء طبقة البيانات - جميع الصفحات باستخدام هذه الطبقة إلى قاعدة بيانات access.مرة واحدة في مكان لإصلاح وتحديث db رمز الوصول.

يأتي هذا القرار فكرت asp.net ترقية غير'f بعيدا, لماذا لا تبدأ باستخدام asp.net على طبقة البيانات?هذه الطريقة التي يمكن إعادة استخدامها عند ترقية الموقع.

وهذا يقودني إلى الأسئلة أعلاه!

هل كانت مفيدة؟

المحلول

إذا كنت تريد أن العصا مع الكلاسيكية ASP ثم أود أن أقترح إنشاء قاعدة بيانات التعامل مع كائن عن طريق ASP الطبقات ثم مجرد استخدام كائن إلى مجموعة السجلات الإبداعات.هذه تمركز قاعدة البيانات الخاصة بك معالجة رمز وجعلها بحيث يكون لديك فقط للتعامل مع هجمات حقن SQL في موقع واحد.

مثال بسيط.

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

بالطبع يمكنك توسيع الطبقة الأساسية للتعامل مع parametrized الإجراءات المخزنة أو ما لا والمزيد من التصديقات.... الخ

نصائح أخرى

الأولى المفضلة نصيحة هذا الاسبوع:لا علاج خدمة الويب الخاص بك مثل ذلك إذا كان كائن محلي أو أنت ذاهب لدفع ضخمة جدا السعر الأداء.أساسا لا تفعل أشياء من هذا القبيل في تطبيق الويب الخاص بك:

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

يجب عليك دائما يفضلون التقليل من المكالمات إلى خدمة ويب (SQL):

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

الآن, بقدر ما نوع البيانات للاستخدام الخاص بك على شبكة الإنترنت خدمة المكالمات فأنت أمام خيارين:

  • DataSet
  • كل شيء آخر (مجموعة)

معظم مجموعات عاد من خدمة ويب (مثل قائمة<MyData>) تحول فعلا إلى مجموعة خلال خدمة ويب الاحتجاج.تذكر أن خدمات ويب لا عودة الأشياء (البيانات + السلوك) ولكن مجرد هياكل البيانات (أو تسلسل).لذلك هناك القليل من التمييز بين قائمة صفيف.

البيانات هي أكثر تعقيدا الطبقات.أنها تستخدم المخصصة الخاصة بهم مسلسل حد كبير على صوغه تماما في تطبيق الاستدعاء.هناك تكلفة في الأداء دفعها باستخدام البيانات مثل ذلك ، حتى أنا عادة لا يوصي معظم السيناريوهات.باستخدام المصفوفات لتمرير البيانات ذهابا وإيابا يميل إلى أن يكون أكثر كفاءة وبصراحة أنه من الأسهل أن تفعل.

حالتك قليلا مختلفة ؛ لأنك تحويل موقع موجود بالفعل يستخدم ADO ، ADO.NET البيانات قد تكون أفضل updgrade المسار.ADO.NET و اللغط متشابهة يكفي أن التحديث مباشرة قد يكون أسهل بهذه الطريقة.انها نوع من يعتمد كيف موقع الويب الخاص بك هو مبني.

عن الجزء الأخير من السؤال البيانات لا تدعم مجموعات سجلات متعددة على غرار اللغط هو مجموعة السجلات.ودعوا DataTables.كل بيانات واحد على الأقل DataTable ويمكنك قراءتها في أي أمر.

حظا سعيدا.

أقترح استخدام XmlHttp فئة في التعليمات البرمجية لـ ASP.

على افتراض لديك ASMX خدمة ويب مشابهة لهذه في MyService.asmx:

[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 الكلاسيكية.

بدلا من التفكير في طبقات لماذا لا نحاول أخذ شرائح عمودية من خلال تطبيق وتحويل تلك .صافي.بهذه الطريقة سوف تحصل على كامل الميزات مشفرة في .صافي بدلا من أجزاء منفصلة.ما هو قيمة الأعمال في استبدال تماما التعليمات البرمجية العمل دون تحسين تجربة المستخدم أو إضافة الميزات ؟

كنت قد تنظر أيضا في المفاضلة الأداء أنت ذاهب لإعطاء مع خدمة ويب على المباشر اللغط المكالمات.خدمات الويب هي حل جيد لمشكلة متعددة منفصلة التطبيقات/فرق الحصول على مخطط مشترك;أنها لا تجعل واحدة معزولة تطبيق أكثر للصيانة فقط أبطأ وأكثر تعقيدا.

بديل آخر هو استخدام Interop COM لإنشاء الجمعية .صافي هذا هو للاستدعاء من الكلاسيكية ASP.

إنشاء تجميع إمكانية التشغيل المتداخل COM من Visual Studio (مثلا ، Microsoft Visual C# 2005 Express Edition):

  • إنشاء فئة جديدة مشروع المكتبة
  • فتح خصائص المشروع

    • في إطار تطبيق حدد الجمعية المعلومات...وتمكين "جعل الجمعية COM-مرئية"
    • تحت توقيع تمكين تسجيل الجمعية إنشاء أو تحديد وجود قوي مفتاح اسم الملف
  • كتابة و بناء مكتبة

    • Interop COM دروس يجب أن يكون منشئ افتراضي فقط غير ثابت دروس و طرق نشر
  • نسخ .dll إلى المجلد المطلوب/آلة

  • تسجيل .dll COM باستخدام RegAsm

على سبيل المثال (ضبط عند الضرورة):

"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 عندما تحديث

انظر أيضا:

حقن Sql يجب أن يتم التعامل معها باستخدام parametrized استعلامات sql.وليس هذا فقط القضاء على المخاطر الأمنية لكنه كبير في تسريع أداء قاعدة البيانات لأنها سوف تكون قادرة على إعادة استخدام خطة التنفيذ بدلا من recalcing في كل مرة.اقتراح التعامل معها من خلال سلسلة بدائل أحمق.VB هو سيء في التعامل مع سلاسل تلك "محل" البيانات سوف تكون مكلفة للغاية في أداء الذاكرة (كما كنت في الواقع تحتاج فقط إلى التعامل مع الشخصية على أي حال)

نقل التعليمات البرمجية .صافي لا تجعل من أفضل.وجود db المدونة في الصفحات الخاصة بك ليست سيئة ؛ خاصة إذا كان معرف كنت تتحدث عن موقع صغير مع فقط بضع المشروعات الإنمائية.الآلاف من المواقع تستخدم هذا الأسلوب إلى عملية bazillions من دولار في المعاملات.الآن unparameterized ديناميكية sql سيئة و يجب العمل على القضاء على ذلك, ولكن هذا لا يتطلب إعادة كتابة التطبيق أو .صافي للقيام بذلك.أنا دائما أتسائل لماذا يرى الناس .صافي كما فعلية تحسين تطبيقاتهم.معظم سيء و العادات السيئة التي كانت موجودة في COM نموذج فقط نشر إلى الأمام أثناء التحويل.

تحتاج إما إلى الالتزام وخلق حقا متماسكة, الحد الأدنى إلى جانب ، OO التصميم ؛ أو تبقي فقط ما عليك الذهاب لأنها ليست كلها سيئة.

سيئة للغاية لم أكن أرى هذا السؤال في عام 2008.بالنسبة لي يبدو أن موقع الويب الخاص بك هو استخدام عادل الإطار.طريقة بسيطة لتعديل عادل رمز تقدم من البحث و مدخلات بيانات على urlencode.أنا فعلت هذا العمل تماما بالنسبة لي.

بقية رمز آمنة بما فيه الكفاية لمنع أي نوع نظام التشغيل SQL حقن أو محاولة الحصول على في قاعدة البيانات الخاصة بنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top