2013-05-15 10 views
5

Spero di essere in grado di personalizzare gli oggetti di errore che vengono passati al client se si verifica un'eccezione sul server.Eccezioni Handlings sul server, personalizzazione dell'argomento fail sul client

sto usando il 'poi' la funzione sul client per gestire il successo e il fallimento:

hub.server.login(username, password).then(function(result) { 
    // use 'result' 
}, function(error) { 
    // use 'error' 
}); 

Se il login ha successo, 'risultato' è il valore di ritorno del metodo Login sul server. Se l'accesso non riesce, lancio un'eccezione di "CustomException". Questa è un'eccezione con una proprietà 'Codice'.

if (!IsValidLogin(username, password)) 
    throw new CustomException { Code: "BADLOGIN", Message: "Invalid login details" }; 

Se ho dettagliato eccezioni abilitate, l'argomento 'errore' nel client è 'password non valido' - la proprietà Message dell'eccezione.

Esiste un modo per modificare selettivamente il risultato dell'errore da una stringa a un oggetto complesso? Ad esempio, se "CustomException" viene lanciato in un metodo hub, restituisce un oggetto {Code: [...], Message: [...]} per il gestore fail-out lato client?

Questo dovrebbe dare prova di quello che mi piacerebbe vedere sul client:

hub.server.login(username, password).then(function(userInfo) { 
    alert("Hello " + userInfo.Name); 
}, function(err) { 
    if (err.Code === "BADLOGIN.USERNAME") 
     alert("Unrecognised user name"); 
    else if (err.Code === "BADLOGIN.PASSWORD"); 
     alert("Invalid password"); 
    else 
     alert("Unknown error: " + err.Message); 
}); 

(Si noti il ​​'Codice' e le proprietà 'messaggio' su 'err').

+0

Perché non si restituisce un oggetto personalizzato invece di generare un errore? –

+0

Semplicemente non sarebbe così pulito. Penso di sapere cosa intendi, una specie di oggetto di ritorno che ha una proprietà 'Result' e 'Error' - una delle quali sarà impostata, una delle quali sarebbe null. L'ho già usato in precedenza, ma mi chiedo solo se un'eccezione potrebbe essere meglio fornita di quella che posso avere il successo e l'accesso fallito si separano automaticamente sul client a causa della natura dei callback "allora". – Barguast

+0

, cioè .then (function (result) {if (result.error) {// failed} else {// success}}); Funzionerebbe, ma non seguirebbe il solito schema di promesse con un ramo separato di successo e fallimento. – Barguast

risposta

3

quando si chiama MapHubs con EnabledDetailedErrors impostate su true come segue:

RouteTable.Routes.MapHubs(new HubConfiguration { EnableDetailedErrors = true }); 

riceverete stringa del messaggio del tuo eccezione come parametro al gestore fallire.

Vedo che l'hai già capito, ma sto includendo il codice lato server per abilitare errori dettagliati per chiunque altro possa trovare questa domanda in seguito.

Sfortunatamente non esiste un modo semplice per inviare un oggetto complesso al gestore errori.

Si potrebbe fare qualcosa di simile però:

if (!IsValidUsername(username)) 
{ 
    var customEx = new CustomException { Code: "BADLOGIN.USERNAME", Message: "Invalid login details" }; 
    throw new Exception(JsonConvert.SerializeObject(customEx)); 
} 
if (!IsValidPassword(username, password)) 
{ 
    var customEx = new CustomException { Code: "BADLOGIN.PASSWORD", Message: "Invalid login details" }; 
    throw new Exception(JsonConvert.SerializeObject(customEx)); 
} 

Poi sul client:

hub.server.login(username, password).then(function(userInfo) { 
    alert("Hello " + userInfo.Name); 
}, function(errJson) { 
    var err = JSON.parse(errJson); 
    if (err.Code === "BADLOGIN.USERNAME") 
     alert("Unrecognised user name"); 
    else if (err.Code === "BADLOGIN.PASSWORD"); 
     alert("Invalid password"); 
    else 
     alert("Unknown error: " + err.Message); 
}); 

So che questo è brutto, ma dovrebbe funzionare.

Problemi correlati