SORU
7 AĞUSTOS 2012, Salı


Nasıl Hata.cshtml ASP.NET MVC denir?

StackOverflow üzerinde bir düzine benzer bir soru okudum, ama bu idrak edemiyorum. Web özel hatalar düğümü görüyor.ve HandleErrorAttribute, nasıl Hata yapar config.hiç adlı cshtml? Sonuçta bu sorunun cevabı bu hata işleme ASP.NET MVC birkaç soru zaten orada ilgili bir cevap olabilir. Ama, işin aslı, hangisi bilmiyorum.

CEVAP
7 AĞUSTOS 2012, Salı


İçinde Küresel.asax aşağıdaki yöntemi vardır:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
}

Bu küresel eylem filtre olarak HandleErrorAttribute kaydeder. Bu işleyicisi otomatik olarak kontrol eylemleri için uygulanır anlamına gelir. Bakalım bu öznitelik kaynak kodu bakarak nasıl uygulanır bir göz atın:

[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes", Justification = "This attribute is AllowMultiple = true and users might want to override behavior.")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class HandleErrorAttribute : FilterAttribute, IExceptionFilter {

    private const string _defaultView = "Error";

    private readonly object _typeId = new object();

    private Type _exceptionType = typeof(Exception);
    private string _master;
    private string _view;

    public Type ExceptionType {
        get {
            return _exceptionType;
        }
        set {
            if (value == null) {
                throw new ArgumentNullException("value");
            }
            if (!typeof(Exception).IsAssignableFrom(value)) {
                throw new ArgumentException(String.Format(CultureInfo.CurrentCulture,
                    MvcResources.ExceptionViewAttribute_NonExceptionType, value.FullName));
            }

            _exceptionType = value;
        }
    }

    public string Master {
        get {
            return _master ?? String.Empty;
        }
        set {
            _master = value;
        }
    }

    public override object TypeId {
        get {
            return _typeId;
        }
    }

    public string View {
        get {
            return (!String.IsNullOrEmpty(_view)) ? _view : _defaultView;
        }
        set {
            _view = value;
        }
    }

    public virtual void OnException(ExceptionContext filterContext) {
        if (filterContext == null) {
            throw new ArgumentNullException("filterContext");
        }
        if (filterContext.IsChildAction) {
            return;
        }

        // If custom errors are disabled, we need to let the normal ASP.NET exception handler
        // execute so that the user can see useful debugging information.
        if (filterContext.ExceptionHandled || !filterContext.HttpContext.IsCustomErrorEnabled) {
            return;
        }

        Exception exception = filterContext.Exception;

        // If this is not an HTTP 500 (for example, if somebody throws an HTTP 404 from an action method),
        // ignore it.
        if (new HttpException(null, exception).GetHttpCode() != 500) {
            return;
        }

        if (!ExceptionType.IsInstanceOfType(exception)) {
            return;
        }

        string controllerName = (string)filterContext.RouteData.Values["controller"];
        string actionName = (string)filterContext.RouteData.Values["action"];
        HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
        filterContext.Result = new ViewResult {
            ViewName = View,
            MasterName = Master,
            ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
            TempData = filterContext.Controller.TempData
        };
        filterContext.ExceptionHandled = true;
        filterContext.HttpContext.Response.Clear();
        filterContext.HttpContext.Response.StatusCode = 500;

        // Certain versions of IIS will sometimes use their own error page when
        // they detect a server error. Setting this property indicates that we
        // want it to try to render ASP.NET MVC's error page instead.
        filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
    }
}

Kaynak kod açıklamalar içeren ve kendi kendine daha açıklayıcı olur. Çekler ilk şey, kendi web özel hataları etkin olup olmadığıdır.config (yani <customErrors mode="On">). Eğer sığınak mi = ^ hiçbir şey yapmaz . YSOD. Eğer özel hatalar etkin varsa o zaman Hata görünümü modeli istisna stacktrace ve diğer faydalı bilgiler içeren geçen işler.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jorrit Jongma

    Jorrit Jongm

    17 Ocak 2008
  • RobertDuskin

    RobertDuskin

    12 HAZİRAN 2008
  • Sali Kaceli

    Sali Kaceli

    24 ŞUBAT 2009