باستخدام httphandlerfactory لتقديم CMS والصفحات المادية
-
01-10-2019 - |
سؤال
أنا في منتصف كتابة نظام CMS وبعد القراءة والعمل من خلال بعض الأمثلة ، لقد استقرت على httphandlerfactory لأداء ما أحتاجه.
النقطة الأساسية هي أن مواقعنا هي بشكل عام مزيج من عمليات النسخ والتسجيل. لذلك ، أحتاج حاليًا إلى استخدام Httphandler الافتراضي لـ ASPX لتقديم صفحات التسجيل الفعلي حتى أتمكن من العمل في إدارتها أيضًا.
بعد إنشاء فئة المعالج ، أضفت ما يلي إلى تكوين الويب الخاص بموقع الويب الخاص بي
<add verb="*" path="*.aspx" type="Web.Helpers.HttpCMSHandlerFactory, Web.Helpers"/>
نظرًا لأن المسار أعلاه يتعامل مع الصفحات المادية و CMS مدفوعة ، مع فحص صغير في الكود ، يمكنني معرفة ما إذا كانت الصفحة موجودة جسديًا ويمكنها بعد ذلك تقديم الصفحة المطلوبة.
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
string pageName = Path.GetFileNameWithoutExtension(context.Request.PhysicalPath);
context.Items.Add("PageName", pageName);
//DirectoryInfo di = new DirectoryInfo(context.Request.MapPath(context.Request.ApplicationPath));
FileInfo fi = new FileInfo(context.Request.MapPath(context.Request.CurrentExecutionFilePath));
//var file = fi.Where(x => string.Equals(x.Name, string.Concat(pageName, ".aspx"), StringComparison.InvariantCultureIgnoreCase)).SingleOrDefault();
if (fi.Exists == false)
{
// think I had this the wrong way around, the url should come first with the renderer page second
return PageParser.GetCompiledPageInstance(url, context.Server.MapPath("~/CMSPage.aspx"), context);
}
else
{
return PageParser.GetCompiledPageInstance(context.Request.CurrentExecutionFilePath, fi.FullName, context);
}
}
السؤال الذي لدي هو هل يجب أن أستخدم شيئًا آخر غير PageParser.GetCompiledPageInstance
عندما تكون هناك صفحة مادية؟
تحديث: منذ ما سبق ، ذهبت إلى تطوير و httphandler للصور ، والتي تعمل مرة أخرى على نفس مبدأ ما إذا كانت الصورة موجودة تستخدمها من قاعدة البيانات. واجهت مشكلة في ملفات PNG ولكن العملية أدناه تعمل لتنسيقات الملفات الموضحة.
byte[] image = null;
if (File.Exists(context.Request.PhysicalPath))
{
FileStream fs = new FileStream(context.Request.PhysicalPath, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
image = br.ReadBytes((int)fs.Length);
}
else
{
IKernel kernel = new StandardKernel(new ServiceModule());
var cmsImageService = kernel.Get<IContentManagementService>();
var framework = FrameworkSetup.GetSetFrameworkSettings();
image = cmsImageService.GetImage(Path.GetFileName(context.Request.PhysicalPath), framework.EventId);
}
var contextType = "image/jpg";
var format = ImageFormat.Jpeg;
switch (Path.GetExtension(context.Request.PhysicalPath).ToLower())
{
case ".gif":
contextType = "image/gif";
format = ImageFormat.Gif;
goto default;
case ".jpeg":
case ".jpg":
contextType = "image/jpeg";
format = ImageFormat.Jpeg;
goto default;
case ".png":
contextType = "image/png";
format = ImageFormat.Png;
goto default;
default:
context.Cache.Insert(context.Request.PhysicalPath, image);
context.Response.ContentType = contextType;
context.Response.BinaryWrite(image);
context.Response.Flush();
break;
}
المحلول
لست متأكدًا مما إذا كان هذا يجيب تمامًا على سؤالك ... لقد قمت أيضًا ببناء ASP.NET CMS الذي كان مدفوعًا Httphandler ، والذي يسمح أيضًا بصفحات .aspx المادية. نظرًا لأنني لم يكن لدي سوى عدد صغير من ملفات ومواقع ASPX المادية ، كانت أسهل طريقة لإدارة التنفيذ عبر web.config.
أولاً ، أقوم بتكوين موقع الويب (بشكل عام) لاستخدام معالجتي - باستثناء صفحة تسجيل الدخول (كمثال):
<add verb="*" path="login.aspx" type="System.Web.UI.PageHandlerFactory"/>
<add verb="*" path="Register.aspx" type="System.Web.UI.PageHandlerFactory"/>
<add verb="*" path="*.aspx" type="Morphfolia.PublishingSystem.HttpHandlers.DefaultHandler, Morphfolia.PublishingSystem"/>
الشيء الآخر الذي يمكنك القيام به هو عزل location
, ، لذلك بالنسبة لهذا الجزء من الموقع ، أختار استخدام معالج ASP.NET خارج الصندوق والذي يعالج عادة "كلاسيكي" طلبات ASP.NET:
<location path="Morphfolia/_publishing">
<system.web>
<httpHandlers>
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
</httpHandlers>
</system.web>
</location>