2013-01-10 12 views
7

In un WebMethod ASMX ASP.NET che risponde a JSON, posso entrambi generare un'eccezione & impostare il codice di risposta HTTP? Ho pensato che se avessi lanciato un'HttpException, il codice di stato sarebbe stato impostato in modo appropriato, ma non è possibile che il servizio risponda con un errore di 500.Posso impostare il codice di risposta HTTP e generare un'eccezione su un servizio JSON ASMX?

Ho provato quanto segue:

[WebMethod] 
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
public void TestWebMethod() { 
    throw new HttpException((int)HttpStatusCode.BadRequest, "Error Message"); 
} 

anche:

[WebMethod] 
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
public void TestWebMethod() { 
    try { 
     throw new HttpException((int)HttpStatusCode.BadRequest, "Error Message"); 
    } 
    catch (HttpException ex) { 
     Context.Response.StatusCode = ex.GetHttpCode(); 
     throw ex; 
    } 
} 

Questi entrambi rispondono con 500.

Molte grazie.

+0

Hai ricevuto ovunque con questo? –

+0

Non ho paura. – Markus

risposta

2

modificare il codice per questo:

[WebMethod] 
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)] 
public void TestWebMethod() { 
    try { 
     throw new HttpException((int)HttpStatusCode.BadRequest, "Error Message"); 
    } 
    catch (HttpException ex) { 
     Context.Response.StatusCode = ex.GetHttpCode(); 

     // See Markus comment 
     // Context.Response.StatusDescription("Error Message"); 
     // Context.Response.StatusDescription(ex.Message); // exception message 
     // Context.Response.StatusDescription(ex.ToString()); // full exception 
    } 
} 

In sostanza non si può, cioè, quando un'eccezione il risultato sarà sempre lo stesso 500.

+0

Ciò causa il problema inverso. L'eccezione non arriva mai alla risposta. Il client ha il codice di stato ma non il messaggio di errore. – Markus

+0

Perché non Response.StatusDescription (ex.ToString()) per avere entrambi? Ho appena aggiornato la mia risposta. –

+1

StatusDescription deve rispecchiare StatusCode (OK per 200, Non trovato per 404, ecc.). Non dovrebbe essere un valore personalizzato. – Markus

Problemi correlati