处理服务器上的异常,自定义客户端上的fail参数

时间:2013-05-15 13:26:27

标签: signalr

如果服务器上发生异常,我希望能够自定义传递给客户端的错误对象。

我在客户端上使用'then'功能来处理成功和失败:

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

如果登录成功,'result'是服务器上Login方法的返回值。如果登录失败,我抛出'CustomException'的异常。这是“代码”属性的例外。

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

如果我启用了详细的例外,客户端上的“错误”参数是“无效的登录详细信息” - 例外的Message属性。

有没有办法可以有选择地将错误结果从字符串更改为复杂对象?即如果在hub方法中抛出'CustomException',则返回客户端失败处理程序的{Code:[...],Message:[...]}对象?

这应该证明我希望在客户端上看到的内容:

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

(注意'错误'上的'代码'和'消息'属性)。

1 个答案:

答案 0 :(得分:3)

当您将EnabledDetailedErrors设置为true调用MapHub时,如下所示:

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

您将收到Exception的Message字符串作为失败处理程序的参数。

我看到你已经弄明白了,但是我要包含服务器端代码,以便为之后可能会发现此问题的其他人启用详细错误。

不幸的是,没有简单的方法将复杂对象发送到失败处理程序。

可以做这样的事情:

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

然后在客户端:

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

我知道这很难看,但它应该有用。