2012-01-17 12 views
17

Sto costruendo un'applicazione MVC 3 con un backend IIS 7.5. Sul mio controller, ho metodi di azione che consentono all'utente di aggiungere/modificare oggetti di dominio. L'azione gestisce HTTP Post, ha un valore di ritorno di stringa che contiene tutti i messaggi di errore di convalida incontrati durante il processo di salvataggio. Ecco un esempio di un metodo di azione:IIS Sovrascrittura testo risposta HTTP quando lo stato di risposta HTTP è impostato su 400

[HttpPost] 
    public string CustomerEdit(CustomerModel customerModel) 
    { 
     var errorMessages = new StringBuilder(); 
     var serverErrors = new List<string>(); 

     //Map to a customer domain object 
     Mapper.CreateMap<CustomerModel, Customer>(); 
     var customer = Mapper.Map<CustomerModel, Customer>(customerModel); 

     if (customerModel.Oper == "del") 
     { 
      var customerIds = new List<Guid>(); 
      customerIds.Add(customer.Id); 

      if (!_serverService.DeleteCustomers(customerIds)) 
      { 
       errorMessages.Append("The item could not be deleted"); 
       Response.StatusCode = Constants.STATUS_SERVER_ERROR; 
      } 
     } 
     else 
     { 
      //Validate 
      if (!_serverService.ValidateCustomer(customer, out serverErrors)) 
      { 
       foreach (var error in serverErrors) 
       { 
        ModelState.AddModelError("Validation", error); 
       } 
      } 

      //Save 
      if (ModelState.IsValid) 
      { 
       var saveStatus = _serverService.SaveCustomer(ref customer, _id); 

       if (!saveStatus) 
       { 
        errorMessages.Append("The server encountered and error during Save"); 
        Response.StatusCode = Constants.STATUS_SERVER_ERROR; 
       } 
      } 
      else 
      { 
       errorMessages.Append(GetValidationErrors(ModelState)); 
       Response.StatusCode = Constants.STATUS_SERVER_ERROR; 
      } 
     } 
     return errorMessages.ToString(); 
    } 

Nel caso di un errore, ho bisogno di impostare la proprietà Response.StatusCode ad un valore pari a 400/500, e restituire una stringa concatenata di messaggi di errore dettagliati . Sfortunatamente, IIS rimuove sempre la mia stringa di errori dal test di risposta e (nel caso di 400 errori) aggiunge la stringa con la stringa "Richiesta errata"

C'è un modo per configurare IIS per restituire un'azione personalizzata, Azione -specifica, stringa quando il codice di stato è impostato su 400?

risposta

17

Dopo aver parlato con un mio amico che è un mago in configurazione di IIS, ho scoperto che in IIS 7 + è possibile aggiungere quanto segue al file web.config:

<system.webServer> 
    <httpErrors errorMode="Detailed"/> 
</system.webServer> 

Se questa impostazione in web.config viene utilizzato, E si imposta il corpo della risposta, quindi il corpo della risposta raggiungerà il client. Se NON si imposta il corpo della risposta, IIS visualizzerà una pagina di errore dettagliata con informazioni dettagliate sull'errore (vedere http://learn.iis.net/page.aspx/267/how-to-use-http-detailed-errors-in-iis/). Molte persone considerano questo un rischio per la sicurezza, quindi usare con cautela.

0

Almeno pagina Configuring HTTP Error Responses in IIS 7 dice

Nota

Non è possibile personalizzare i seguenti messaggi di errore HTTP 400, 403.9, 411, 414, 500, 500,11, 500,14, 500,15, 501 , 503, e 505.

EDIT: anche se nelle risposte di this question, che sembra abbastanza simile, v'è una risposta affermando ° almeno si può fare qualcosa con la configurazione di httpErrors.

+0

Ho trovato un modo per farlo, per favore vedi la mia risposta per i dettagli – TheoryOfLight

13

In MVC è anche possibile farlo su base Azione per Azione. Vedi TrySkipisCustomErrors.

Usa:

Response.TrySkipIisCustomErrors = true; 
Response.StatusCode = (int)HttpStatusCode.BadRequest; 
return this.Json(SomeJsonObject); // could output string too 
+0

Mi ha aiutato. L'ho usato con il codice di stato 422 (non provato con 400) –

1

abbiamo finito con l'andare per

<system.webServer> 
    <httpErrors errorMode="Custom" existingResponse="PassThrough"> 
</system.webServer> 

nel web.config. Che ha consentito errori personalizzati che impostano i codici di stato per lasciare IIS non molestato.

Problemi correlati