كيف يمكنني أن أعرف على جانب العميل عند معالج HTTP تتم معالجة ؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

ربما طويل السؤال عن الحل بسيط, ولكن هنا يذهب...

لدي العرف سيلفرلايت السيطرة على اختيار ملفات متعددة وإرسالها إلى الملقم.يرسل الملفات إلى معالج (FileReciever.ashx) باستخدام OpenWriteAsync طريقة WebCLient التحكم.

أساسا ، سيلفرلايت رمز يفعل شيئا مثل هذا لكل ملف:

WebClient client = new WebClient();
client.OpenWriteCompleted += (sender, e) =>
  {
    PushData(data, e.Result);
    e.Result.Close();
    data.Close();
  };
client.OpenWriteAsync(handlerUri); 

جانب الملقم معالج ببساطة يقرأ واردة تيار ، ثم يفعل بعض المعالجة الناتجة صفيف بايت.

المشكلة هي أن العميل OpenWriteCompleted يتم بمجرد أن جميع البيانات قد تم إرسالها عبر السلك.قانون بلدي ثم contine مع الملف التالي.ما أريده حقا هو أن ننتظر حتى ASHX معالج قد انتهيت من كل ذلك هو معالجة هذا الطلب.كيف أفعل ذلك ؟ أي الانتظار آلية WebClient?أي رد لا يمكن القيام به على HttpContext في معالج ؟ يجب استخدام نوع آخر من نقل التقنية ؟ يرجى تقديم المشورة!

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

المحلول

إدارة الموارد البشرية, ربما بسيط solutioin يمكن أن الوسم url مع المعرف الفريد العمومي(guid كونها فريدة من نوعها لكل ملف أو نقل أيا كان من المنطقي الخاص بك situatuation).ثم هل يمكن أن يكون بسيط آخر خدمة ويب قادر على التحقق من حالة خدمة أخرى ، على أساس guid الخاص بك سيلفرلايت العميل استعلام خدمة جديدة عن حالة الطلب(عن طريق تمرير خدمة ويب جديدة guid الماضي نقل).

نصائح أخرى

نفس السؤال تم طرحه في سيلفرلايت المنتديات.Microsoft أقرت كان الجواب أنه لا يمكنك أن تفعل ذلك مع WebClient و OpenWriteAsync.تحتاج إلى إما المستخدم UploadStringAsync أو HttpWebRequest.

أنا على افتراض أن كنت قلقة من أن البيانات التي يتم إرجاعها من معالج تأخذ وقت طويل ونقل server لا يتم الاستفادة خلال ذلك الوقت.ليس هناك طريقة لمعرفة ما إذا كان الملقم يتم تجهيز, لذلك أنا لا أعتقد أنك يمكن أن تفعل هذا دون تغيير العمارة.

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

أو ربما يمكنك أن تفعل ذلك مع جافا سكريبت (مسج)...إذا كنت لا تمانع في استخدام جافا سكريبت ذلك.

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

تجنب هذا النهج إذا كان حجم الملف غير محدود ، لكن إذا كان يمكنك الآن أنها سوف تكون صغيرة نسبيا ، فمن الممكن استخدام هذا النهج.

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