Ho un'API Web che rende richieste HTTP a un servizio Windows che esegue determinate attività/comandi.Passaggio di eccezioni tra due programmi C# utilizzando JSON
Se il mio 'servizio' genera un'eccezione, allora voglio passare quell'eccezione eseguendo il backup della pipa sull'API Web utilizzando JSON. Quindi voglio de-serializzare l'eccezione su un oggetto eccezione e lanciarlo.
il mio codice:
eccezione condivisa tra API Web e di servizi:
public class ConnectionErrorException : Exception
{
public ConnectionErrorException()
{
}
public ConnectionErrorException(String message)
: base(message)
{
}
}
Ora nel mio servizio che ho il seguente codice:
...
try
{
result = await ExecuteCommand(userId);
//If reached here nothing went wrong, so can return an OK result
await p.WriteSuccessAsync();
}
catch (Exception e)
{
//Some thing went wrong. Return the error so they know what the issue is
result = e;
p.WriteFailure();
}
//Write the body of the response:
//If the result is null there is no need to send any body, the 200 or 400 header is sufficient
if (result != null)
{
var resultOutput = JsonConvert.SerializeObject(result);
await p.OutputStream.WriteAsync(resultOutput);
}
...
Così qui ho restituire un oggetto JSON . O l'oggetto della risposta effettiva o l'eccezione che si è verificata.
allora ecco il codice del Web API che rende la richiesta al servizio:
// Make request
HttpResponseMessage response = await client.PostAsJsonAsync(((int)(command.CommandId)).ToString(), command);
if (response.IsSuccessStatusCode)
{
return await response.Content.ReadAsStringAsync();
}
else
{
var exception = HandleErrorResponse(await response.Content.ReadAsStringAsync());
var type = exception.GetType();
//TODO: try and determine which exact exception it is.
throw exception;
}
Ora qui, se la risposta è stata di successo ho appena restituire il contenuto della stringa. Se la richiesta non riesce, provo a passare la risposta JSON a un'eccezione. Comunque devo passare all'eccezione base come faccio io - non so di che tipo sia ancora. Tuttavia quando eseguo il debug e aggiungo un watchdog all'eccezione. C'è un parametro _className
che dice 'Domain.Model.Exceptions.API.ConnectionErrorException`.
Domanda: Come è possibile determinare quale sia la deroga è stato restituito e de-serializzare di nuovo al l'eccezione corretta in modo che posso buttare di nuovo. Devo conoscere il tipo esatto di eccezione perché gestisco tutte le diverse eccezioni più avanti nel mio livello di servizi nell'API Web.
Ecco un esempio di JSON, che viene restituito per la ConnectionErrorException
:
{
"ClassName": "Domain.Model.Exceptions.API.ConnectionErrorException",
"Message": null,
"Data": null,
"InnerException": null,
"HelpURL": null,
"StackTraceString": "",
"HResult": -2146233088,
"Source": "LinkProvider.Logic",
"WatsonBuckets": null
}
L'idea è che voglio sapere che tipo di eccezione viene lanciata. Più avanti nel livello dei miei servizi mi occupo di tutti gli errori specifici. Quindi ho bisogno di ottenere il tipo esatto di errore. – Zapnologica
@Zapnologica ha modificato la mia risposta ... questo dovrebbe risolvere il problema – Aminul