2016-02-23 13 views
7

Utilizzando C# Web Api 2, ho il codice che genera un InvalidOperationException. Quando si restituisce un codice di stato di 302, in che modo fornire una posizione per il reindirizzamento utilizzando l'annotazione HandleException?Come si specifica la posizione quando si utilizza l'annotazione handleexeption per un codice di stato 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"); 
    } 
} 

Edit: Mi dispiace, ho fatto questa domanda in un po 'di fretta. La classe precedente utilizza una classe HandleExceptionAttribute che eredita da ExceptionFilterAttribute. Non me ne sono reso conto al momento che stavo cercando di eseguire il debug del loro test unitario. Il problema non si presenta in un test unitario, ma viene visualizzato utilizzando un .webtest di Visual Studio che richiede l'url di reindirizzamento. La classe che eredita da ExceptionFilterAttribute non ha fornito un parametro che consente di fornire l'URL reindirizzato. Ci scusiamo per una domanda incompleta e grazie per aver dedicato del tempo a rispondere.

/// <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

L'attributo ** HandleException ** è il tuo? Puoi fornire il codice sorgente o il collegamento al codice sorgente per vedere cosa puoi fare per migliorarne l'utilizzo? – D4rkTiger

+1

Utilizza il filtro delle eccezioni e imposta la tua logica di reindirizzamento lì. Puoi anche impostare il reindirizzamento basato sulle condizioni nei filtri. –

+0

Dammi più informazioni per aiutarti con la risposta appropriata. –

risposta

3

Modificato: Grazie per l'aggiornamento della domanda. Anche se non sono ancora esattamente sicuro del perché si voglia reindirizzare in questo metodo WebApi. Speriamo che questa risposta possa aiutare comunque.

Vorrei gestire tutta la logica di eccezione in HandleExceptionAttribute. Potresti anche reindirizzare da lì con il codice 302 che stai cercando. Il tuo HandleExceptionAttribute sarebbe simile a questa (ho incluso 3 modi diversi di restituire un risultato sulla base di un'eccezione):

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."); 
    } 
} 

Tuttavia, se si vuole veramente fatto il modo in cui si chiede, si potrebbe aggiungere un secondo parametro per il tuo metodo GetHandleException. Ciò avrebbe preso in una stringa di messaggio (o l'URL) poi nella vostra HandleExceptionAttribute si dovrebbe aggiungere l'URL di reindirizzamento al parametro (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"); 
    } 
} 

Allora la vostra HandleExceptionAttribute si presenta così:

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

    } 
} 
+1

L'utente desidera reindirizzare a pagine specifiche in base all'eccezione. –

+1

La domanda è un po 'confusa. Stai provando a lanciare l'eccezione? In tal caso, che ne pensi di creare un'eccezione personalizzata da sola con dati aggiuntivi su di essa, come la posizione in cui desideri reindirizzare? – drunkcoder

+0

@TheEmirOfGroofunkistan Ho aggiornato la mia risposta in base alla sua domanda aggiornata. –

0

Improvise dal seguente

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); 
    } 
} 

Uso

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

Anche se non vedo il punto di avere del contenuto lì quando questo è reindirizzato a una pagina visiva. ma andiamo

Problemi correlati