2012-09-26 25 views
8

मैं कोड जो Global.asax में सभी अपवादों को पकड़ने हैहैंडलिंग अपवाद ASP.NET MVC

protected void Application_Error(object sender, EventArgs e) 
     { 
      System.Web.HttpContext context = HttpContext.Current; 
      System.Exception exc = context.Server.GetLastError(); 
      var ip = context.Request.ServerVariables["REMOTE_ADDR"]; 
      var url = context.Request.Url.ToString(); 
      var msg = exc.Message.ToString(); 
      var stack = exc.StackTrace.ToString(); 
     } 

मैं नियंत्रक नाम कैसे प्राप्त कर सकते हैं जहां इस त्रुटि

हुआ मैं कैसे प्राप्त कर सकते हैं क्लाइंट आईपी का अनुरोध करें?

और क्या मैं अपवाद फ़िल्टर कर सकता हूं? मैं 404 की जरूरत है, 504 न .... erors

धन्यवाद

+0

'मुझे 404, 504 की आवश्यकता नहीं है .... erors' ehh? इस तरह HTTP काम करता है। और 'क्या मैं अपवाद फ़िल्टर कर सकता हूं' के साथ आपका क्या मतलब है? – jgauffin

+0

यह पोस्ट निश्चित रूप से आपकी मदद करेगा http://prideparrot.com/blog/archive/2012/5/exception_handling_in_asp_net_mvc – VJAI

उत्तर

6

ग्लोबल.एक्सएक्स में नियंत्रकों और कार्यों की धारणा नहीं है, इसलिए मेरा मानना ​​है कि नियंत्रक और क्रिया नामों को पुनर्प्राप्त करने के लिए कोई एपीआई नहीं है। लेकिन अगर आप को हल करने के लिए अनुरोध URL आजमाइए सकता है:

HttpContextBase currentContext = new HttpContextWrapper(HttpContext.Current); 
UrlHelper urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext); 
RouteData routeData = urlHelper.RouteCollection.GetRouteData(currentContext); 
string action = routeData.Values["action"] as string; 
string controller = routeData.Values["controller"] as string; 

उपयोगकर्ता आईपी प्राप्त करने के लिए आप UserHostAddress संपत्ति का उपयोग कर सकते हैं:

string userIP = HttpContext.Current.Request.UserHostAddress; 

बाहर फ़िल्टर करने के लिए HTTP अपवाद है कि आप को संभालने के लिए कर सकते हैं नहीं जा रहे हैं की तरह कुछ का उपयोग करें:

HttpException httpException = exception as HttpException; 
if (httpException != null) 
{ 
    switch (httpException.GetHttpCode()) 
    { 
     case 404: 
     case 504: 
      return; 
    } 
} 

एक अपवाद हैंडलिंग के बारे में पिछले टिप्पणी - यह जब वहाँ इसे और अधिक loc प्रदर्शन करने के लिए एक तरीका है वैश्विक स्तर पर यह करने के लिए एक सबसे अच्छा अभ्यास नहीं है सहयोगी।

protected virtual void OnException(ExceptionContext filterContext) 

, जो जब अधिरोहित, आप हुआ अपवाद पर पूरा नियंत्रण दे देंगे: ASP.NET MVC आधार Controller कक्षा में उदाहरण के लिए एक विधि है। आपके पास ग्लोबल.एएसएक्स प्लस एएसपी.नेट एमवीसी विशिष्ट सुविधाओं जैसे कि नियंत्रक के संदर्भ, संदर्भ, मार्ग डेटा इत्यादि के लिए उपलब्ध सभी जानकारी हो सकती है

+0

एंड्री आपके कोड को पूरी तरह से चलाने के लिए धन्यवाद। क्या आप बेस कंट्रोलर क्लास के बारे में कुछ अच्छा ट्यूटोरियल प्रदान कर सकते हैं? –

+0

@ एसीआईडी, निश्चित रूप से। बुनियादी उदाहरणों के लिए यह देखें [ब्लॉग पोस्ट] (http://www.entwicklungsgedanken.de/2009/07/16/redirect-from-the-onexception-method-inside-the-controller-with-asp-net-mvc /) और यह [लेख] (http://www.devproconnections.com/article/aspnetmvc/aspnet-exception-141263)। – Andrei

+0

आप UrlHelper उपयोग (और एमवीसी संदर्भ को छोड़कर) का उपयोग कर छोड़ सकते हैं ... 'रूटडाटा रूटडाटा = सिस्टम। वेब। रूटिंग। रूटटेबल। रूट्स। गेटरौटडेटा (वर्तमान कॉन्टेक्स्ट);' –

3

मैं इस तरह इस्तेमाल किया यह नीचे

है तो आप इस

var userip = context.Request.UserAgent; 

तरह उपयोगकर्ता आईपी प्राप्त कर सकते हैं और आप अपने यूआरएल प्राप्त कर सकते हैं जहां यह त्रुटि इस

var ururl = System.Web.HttpContext.Current.Request.Url; 

मुझे लगता है कि यह आपकी मदद करेगा ...

0

मैं एक अलग tack और put अपने नियंत्रकों पर एक विशेषता का उपयोग करें (या यदि आपके पास आधार नियंत्रक है)

public class HandleErrorAttributeCustom : HandleErrorAttribute 
    { 
     public override void OnException(ExceptionContext context) 
     { 
      //you can get controller by using 
      context.Controller.GetType() 

      //however, I'd recommend pluggin in Elmah here instead 
      //as it gives this easily and also can has filtering 
      //options that you want 

     } 
}