سؤال

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

حاليا أنا أستخدم system.web.httpcontext.current للحصول على السياق الحالي.

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

ومع ذلك ، فإن Controller.httpContext يعيد NULL على الإنشاء (أعتقد أن هذا حسب التصميم) ولكن أيضًا على تهيئة وتنفيذ الطرق (ما لم أستخدم ROTING.REQUESTCONTEXT.HTTPCONTEXT؟).

لذلك إذا كان ينبغي علي استخدام Controller.httpContext بدلاً من httpcontext.current ، في أي نقطة متاحة لي في طلب؟

شكرا بن

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

المحلول

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

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

public class LoggingFilterAttribute : ActionFilterAttribute
{
  public override void OnActionExecuting(ActionExecutingContext filterContext)
  {
    filterContext.HttpContext.Trace.Write("(Logging Filter)Action Executing: " +
        filterContext.ActionDescriptor.ActionName);

    base.OnActionExecuting(filterContext);
  }

  public override void OnActionExecuted(ActionExecutedContext filterContext)
  {
    if (filterContext.Exception != null)
        filterContext.HttpContext.Trace.Write("(Logging Filter)Exception thrown");

    base.OnActionExecuted(filterContext);
  }
}

أقترح عليك قراءة سمات مخصصة. ولكن ماذا تقصد بمزيد من الاختبار؟ يمكنك بسهولة السخرية

نصائح أخرى

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

public class CookieValidator : ICookieValidator
{
   private HttpContext _Context;
   public HttpContext Context
   {
      get
      {
         if(_Context == null)
         {
             _Context = HttpContext.Current;
         }
         return _Context;
      }
      set  // set a mock here when unit testing
      {
         _Context = value;
      }
   }

BOLOL BOOL HASVALIDCOOKIES () {_Context ... // قم بمنطقك هنا}}

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