2016-02-23 12 views
7

के लिए हैंडलएक्सप्शन एनोटेशन का उपयोग करते समय आप स्थान निर्दिष्ट करते हैं, सी # वेब एपीआई 2 का उपयोग करते हुए, मेरे पास कोड है जो InvalidOperationException फेंकता है। 302 का स्टेटस कोड लौटने पर, HandleException एनोटेशन का उपयोग करके रीडायरेक्ट के लिए स्थान कैसे प्रदान करें?302 स्थिति कोड

[HandleException(typeof(InvalidOperationException), HttpStatusCode.Found, ResponseContent = "Custom message 12")] 
public IHttpActionResult GetHandleException(int num) 
{ 
    switch (num) 
    { 
      case 12: throw new InvalidOperationException("DONT SHOW invalid operation exception"); 

      default: throw new Exception("base exception"); 
    } 
} 

संपादित करें: क्षमा करें, मैंने इस प्रश्न को जल्दबाजी में पूछा। उपर्युक्त कक्षा एक हैंडलएक्सप्शन एट्रिब्यूट क्लास का उपयोग करती है जो ExceptionFilterAttribute से प्राप्त होती है। मुझे उस समय एहसास नहीं हुआ जब मैं अपने यूनिट टेस्ट को डीबग करने की कोशिश कर रहा था। समस्या यूनिट परीक्षण में उत्पन्न नहीं होती है, लेकिन एक विजुअल स्टूडियो का उपयोग करके दिखाई देती है। वेबस्टेस्ट जिसके लिए रीडायरेक्ट यूआरएल की आवश्यकता होती है। ExceptionFilterAttribute से विरासत में प्राप्त वर्ग ने पैरामीटर प्रदान नहीं किया है जो पुनर्निर्देशित यूआरएल की आपूर्ति के लिए अनुमति देता है। एक अपूर्ण प्रश्न के लिए खेद है और उत्तर देने के लिए समय लेने के लिए धन्यवाद।

/// <summary> 
    /// This attribute will handle exceptions thrown by an action method in a consistent way 
    /// by mapping an exception type to the desired HTTP status code in the response. 
    /// It may be applied multiple times to the same method. 
    /// </summary> 
    [AttributeUsage(AttributeTargets.Method, Inherited = false, AllowMultiple = true)] 
    public sealed class HandleExceptionAttribute : ExceptionFilterAttribute 
    { 
+1

** हैंडलएक्सप्शन ** विशेषता आपकी है? क्या आप स्रोत कोड या स्रोत से लिंक देख सकते हैं यह देखने के लिए कि आप इसका उपयोग सुधारने के लिए क्या कर सकते हैं? – D4rkTiger

+1

अपवाद फ़िल्टर का उपयोग करें और अपने रीडायरेक्ट तर्क को वहां सेट करें। आप फ़िल्टर में हालत आधारित पुनर्निर्देशन भी डाल सकते हैं। –

+0

उचित उत्तर के साथ आपकी सहायता करने के लिए मुझे और जानकारी दें। –

उत्तर

3

संपादित: के लिए धन्यवाद सवाल अपडेट किया गया। हालांकि मुझे अभी भी बिल्कुल यकीन नहीं है कि आप इस वेबएपी विधि में रीडायरेक्ट क्यों करना चाहते हैं। उम्मीद है कि यह जवाब हालांकि मदद कर सकता है।

मैं हैंडलएक्सप्शन एट्रिब्यूट में सभी अपवाद तर्क को संभालता हूं। आप वहां से 302 कोड के साथ भी वहां से रीडायरेक्ट कर सकते हैं। आपका HandleExceptionAttribute इस प्रकार दिखाई देगा (मैं एक परिणाम के एक अपवाद के आधार पर लौटने के 3 अलग अलग तरीकों को शामिल किया है):

public sealed class HandleExceptionAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     //TODO: we can handle all types of exceptions here. Out of memory, divide by zero, etc etc. 
     if (context.Exception is InvalidOperationException) 
     { 
      var httpResponseMessage = context.Request.CreateResponse(HttpStatusCode.Redirect); 
      httpResponseMessage.Headers.Location = new Uri("http://www.YourRedirectUrl"); 
      throw new HttpResponseException(httpResponseMessage); 
     } 
     if (context.Exception is UnauthorizedAccessException) 
     { 
      context.Response = context.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, context.Exception.Message); 
      return; 
     } 
     if (context.Exception is TimeoutException) 
     { 
      throw new HttpResponseException(context.Request.CreateResponse(HttpStatusCode.RequestTimeout, context.Exception.Message)); 
     } 

     context.Response = context.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Unable to process your request."); 
    } 
} 

लेकिन यदि आप वास्तव में इसे जिस तरह से आप से पूछना किया चाहते हैं, आप के लिए एक दूसरा पैरामीटर जोड़ सकते हैं आपकी GetHandleException विधि। इस संदेश स्ट्रिंग (या URL) में ले जाएगा तो अपने HandleExceptionAttribute में आप पैरामीटर के लिए पुनर्निर्देश url जोड़ना होगा (ActionArguements):

public IHttpActionResult GetHandleException(int num, string message = "") 
{ 
    switch (num) 
    { 
     case 12: return Redirect(message); //message string would be your url 

     default: throw new Exception("base exception"); 
    } 
} 

फिर अपने HandleExceptionAttribute इस तरह दिखता है:

public sealed class HandleExceptionAttribute : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext context) 
    { 
     context.ActionContext.ActionArguments["message"] = "your redirect URL"; 

    } 
} 
+1

उपयोगकर्ता अपवाद के आधार पर विशिष्ट पृष्ठों पर रीडायरेक्ट करना चाहता है। –

+1

सवाल थोड़ा उलझन में है। क्या आप अपवाद फेंकने की कोशिश कर रहे हैं? यदि हां, तो आप उस स्थान पर अतिरिक्त डेटा के साथ अपने आप पर कस्टम अपवाद कैसे बना सकते हैं, जिस स्थान पर आप रीडायरेक्ट करना चाहते हैं? – drunkcoder

+0

@TheEmirOfGroofunkistan मैंने आपके अपडेट को आपके अपडेट किए गए प्रश्न के आधार पर अपडेट किया है। –

0

सुधारने निम्नलिखित

public class HandleExceptionAttribute : ExceptionFilterAttribute 
{ 
    public Type ExceptionType { get; set; } 

    public HandleExceptionAttribute(Type exceptionType) 
    { 
     ExceptionType = exceptionType; 
    } 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     if (actionExecutedContext.Exception.GetType()==ExceptionType) 
     { 
      var response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.Moved); 
      response.Headers.Location=new Uri("http://google.co.uk"); 
      response.Content=new StringContent("Message"); 
      actionExecutedContext.Response = response; 
     } 
     base.OnException(actionExecutedContext); 
    } 
} 

प्रयोग से

[HandleException(typeof(ExceptionOfTypeA))] 
    public HttpResponseMessage Get(int id) 
    { 
     throw new ExceptionOfTypeA(); 
    } 

हालांकि मैं दृश्य पृष्ठ पर रीडायरेक्ट होने पर वहां सामग्री रखने का बिंदु नहीं देखता हूं। लेकिन वहां हम

संबंधित मुद्दे