تخزين ملفات المستخدم المؤقتة في ASP.NET بثقة متوسطة

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

  •  07-07-2019
  •  | 
  •  

سؤال

لدي سيناريو يقوم فيه مستخدمو تطبيق الويب ASP.NET الخاص بي بإرسال شهادات تتكون من معلومات نصية وصور.تتضمن عملية الإرسال الخطوات التالية:

  • يقوم المستخدم أولاً بإدخال المحتوى واختيار المسار إلى الصورة
  • عندما ينقر على معاينة، تظهر المعلومات مرة أخرى حتى يتمكن من التأكيد
  • بمجرد التأكد من استمرار المعلومات في قاعدة البيانات

تكمن المشكلة في ذلك في أنني لا أرغب في تخزين الصور التي تم تحميلها في قاعدة البيانات قبل أن يؤكد المستخدم فعليًا.وبدلاً من ذلك، أقوم بتخزينها كملفات مؤقتة ووضعها في قاعدة البيانات فقط بعد التأكيد النهائي.

وبما أنني أريد أيضًا أن يعمل تطبيقي بثقة متوسطة، فلدي أذونات الكتابة فقط في دليل التطبيق وليس في أي مكان خارجه.أريد أيضًا قصر أذونات الكتابة لمستخدم ASPNET / NETWORK SERVICE على المجلد ~/App_Data.المشكلة في السيناريو الخاص بي هي أنه بمجرد إنشاء ملف مؤقت في هذا المجلد، تتم إعادة تدوير مجمع التطبيقات ولا أريد ذلك في كل إرسال شهادة.

كيف تنصحني بالاحتفاظ بهذه الملفات المؤقتة بدلاً من ذلك؟لا تتم إعادة تشغيل المجمع إذا قمت بتحديث ملف - فقط عند الإنشاء أو إعادة التسمية.لكنني لا أعتقد أنه يمكنني تخزين صور كاملة في ملف واحد لجميع المستخدمين.ماذا تعتقد؟

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

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

المحلول

أوصي تخزين معزول.إنه نوع من المجلد الظاهري.

هنا مقتطف من مثال على CodeProject:

IsolatedStorageFileStream stream = 
  new IsolatedStorageFileStream(ISOLATED_FILE_NAME, 
  FileMode.Create, isoStore);

StreamWriter writer = new StreamWriter( stream );
writer.WriteLine( "This is my first line in the isolated storage file." );
writer.WriteLine( "This is second line." );
writer.Close();

تحديث:لتنظيف ملفك، فقط قم بما يلي:

string fileName = "isolatestorage.txt";

IsolatedStorageFile storage = IsolatedStorageFile.GetStore(
    IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);

string[] files = storage.GetFileNames(fileName);
foreach(string file in files) {
    if(file == fileName) {
        storage.DeleteFile(file);
        break;
    }
}

نصائح أخرى

من المعروف أن الملف web_mediumtrust.config الافتراضي الذي تشحنه Microsoft غير عملي.

فيما يلي مقتطف من ملف web_mediumtrust.config الافتراضي.بشكل افتراضي، لا يمكنك استخدام System.IO لاكتشاف المجلد المؤقت أو الكتابة إليه.

                        <IPermission
                                class="FileIOPermission"
                                version="1"
                                Read="$AppDir$"
                                Write="$AppDir$"
                                Append="$AppDir$"
                                PathDiscovery="$AppDir$"
                        />

على الرغم من أنني لم أجرب استخدام التخزين المعزول كما ذكر @Seb، إلا أنه يبدو أنه مسموح به بواسطة ملف التكوين الافتراضي.

لا يزال بإمكانك استخدام العادي Path.GetTempFilename() للحصول على ملف مؤقت في سيناريوهات ASP.NET.

يجب أن يوفر لك مسار ملف مؤقت يمكن الكتابة عليه بواسطة NETWORK_SERVICE ولكنه موجود أيضًا في أحد المجلدات المؤقتة لنظام Windows، وليس مجلد التطبيق الخاص بك.

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

هذا رد على Leppie الذي علق على سؤالي (لتجنب الحد الأقصى لعدد الأحرف)

من: http://blogs.msdn.com/johan/archive/2007/05/16/common-reasons-why-your-application-pool-may-unexpectedly-recycle.aspx

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

هل أنت متأكد أنه ليس من المفترض إعادة التدوير؟

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