بديل للحصول على سلسلة الاستعلام وملفات تعريف الارتباط عند إرسال البيانات إلى الخادم؟

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

سؤال

لدي مشكلة صغيرة (أو ربما ليست صغيرة جدا) مع بعض مواقع Monorail ASP.NET/NET/CASTLE للمنتج الذي أعمل فيه. هذا هو نظام إرث إلى حد ما (مكتوب جيدا قبل وقتي)، ويستخدم الحصول على طلبات مع كمية كبيرة من المعلومات في سلسلة الاستعلام. لقد وصلنا مؤخرا إلى قيود طول سلسلة الاستعلام، وبالنسبة لكمية البيانات التي نحتاجها لنقلها إلى الخادم، فإن تخزين البيانات مؤقتا في ملف تعريف الارتباط غير معقول (نحن قد تجاوزنا بالفعل الحد 4096 البايت لكل ملفات تعريف الارتباط، ونحن حدد الكثير من ملفات تعريف الارتباط، لذلك نحن على الأرجح قريبا أو في حدود ملفات تعريف الارتباط لكل مجال أيضا.)

أتساءل عما إذا كان هناك أي بدائل، إلى جانب النشر (في بعض الحالات المتغيرة إلى طلب ما بعد قد يكون من الممكن، ولكن من المحتمل ألا يكون ذلك في الكل)، قد يحل هذه المشكلة. آمل أن يركض شخص آخر هنا على Stackoverflow مشكلات مماثلة، ولديه بعض الحلول المعالج (أي ضغط البيانات مع JavaScript وتشفير كعند Base64 أو تمرير إلى عنصر سلسلة استفسار واحد؟ لست متأكدا مما إذا كانت هناك أي مكتبات يمكنها ضغط البيانات مع جافا سكريبت بطريقة متوافقة مع فئات ضغط مدمجة في .NET 3.5.)

تحديث:

الحل الذي انتهى بي الأمر بالاختيار كان للنشر إلى وحدة تحكم مؤقتة. سحبت وحدة التحكم TEMP هذه القائمة الكبيرة بالبيانات، عالقة في جلسة مشتركة (توجد خوادم الإنتاج في مزرعة كبيرة متعددة البنوك لا تستخدم جلسات لزجة / IPs)، وأعد الوصول إلى وحدة التحكم الفعلية، والتي سحبها البيانات من الجلسة المشتركة. ليس الحل الأكثر أداء، لكنه حل المشكلة.

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

المحلول

هناك العديد base64 تشفير الإضافات jQuery, ، لكن هذا لا يساعد ذلك Base64 عموما يجعل البيانات لفترة أطول, ، وليس أقصر.

اعتمادا على البيانات، أود أن أنظر إلى أساليب ضغط النص الأخرى. ويكيبيديا تسرد عدد قليل:

  • طريقة تحول شجرة السياق (CTW)
  • تحول الجحور ويلر (كتلة الفرز المعالجة المسبقة التي تجعل الضغط أكثر كفاءة)
  • LZ77 (المستخدمة من خلال الانفديل)
  • lzw.

هنا تنفيذ LZW لجافا سكريبت.

هوفمان ترميز يعتمد على تردد الحروف، لذلك قد لا يكون مناسبا لبياناتك. ربما عليك الهروب من النتيجة لجعل عنوان URL آمنا.

نصائح أخرى

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

أود أن أقترح استخدام JSON كنسيق نقل البيانات إذا تم إنشاء صفيف مثل سلسلة الاستعلام على النحو التالي:

params[]=sth&params[]=sth2&params[]=sth3

هذا سوف يكون

{params:['sth1', 'sth2', 'sth3']}

يمكنك SSSign سلسلة JSON هذه إلى متغير حرف واحد مثل أدناه

p={params:['sth1', 'sth2', 'sth3']}

سيكون من الأفضل أن يكون هناك شيء أفضل ضغط وترميز Base64 سلسلة الاستعلام بأكملها. نظرا لأنك توليد سلسلة الاستعلام على جانب الخادم (أفترض أن هذا ولكن نفس الشيء يمكن القيام به في JS باستخدام نفس الخوارزميات Comp / Decomp)، يمكنك استخدام أي خوارزمية ضغط مدمجة مع لغة البرمجة مثل Gzip. بعد Base64 ترميز البيانات المضغوطة، نعم، ستوسع قليلا ولكن ليس بقدر ترميز URL توسيعه.

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

إجابة الكتب المدرسية هي استخدام البريد. لماذا لا يكون هذا ممكنا؟ تم اختراع السبب الذي تم اختراعه كثيرا لتحصل على حدود الطول في الحصول عليها.

احتمال آخر اعتمادا على التفاصيل هو الحصول على شاشات متعددة، ولكل منها مجموعة فرعية من البيانات، وتخزين البيانات من كل من كل من الخادم وتوصيلها في النهاية.

هل قيود سلسلة الاستعلام على العميل أو الخادم؟

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

هل هذا لعقد معلومات الدولة بين الصفحات؟ إذا كان الأمر كذلك، فقد يكون هناك خيار استخدام ملف تعريف الارتباط مع قيمة GUID على هذا النحو:

_SESSIONID=3F2504E0-4F89-11D3-9A0C-0305E82C3301

وتخزين جانب جلسة معلومات الخادم. يتم تحديد الجلسة بشكل فريد مع GUID، لذلك من السهل بعد ذلك استرداد كمية كبيرة من المعلومات مباشرة على الخادم.

كل ما تحتاجه ثم تحتاج إلى إرسال / استرداد جانب العميل هو معرف الجلسة، وكذلك المعلومات التي تم إنشاؤها العميل (GET/POST مجالات).

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