だから私はajaxを使ってRESTサービスを呼んでいます:
$("#loginsubmit").on('click', function () {
showtooltip('Please wait...', false);
$('#loginsubmit').attr("disabled", true);
$.ajax({
url: '@Utility.ConstructRestURL("Authenticate/Login")',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify({
client: {
SessionID: '@Utility.GetSession(Utility.GetConfigString("ClientSessionID"))'
},
loginfo: {
u: $("#loginusername").val(),
p: $("#loginpassword").val()
}
}),
success: function (response) {
if (response.LoginResult.SessionID != null || response.LoginResult.UserID != null || response.LoginResult.SourceIP != null) {
$.post('@Url.Action("SaveSession", "Auth")', response.LoginResult, function (msg) {
window.location.replace(msg.url);
});
} else {
showtooltip('Login failed.', false);
$('#loginsubmit').removeAttr("disabled");
}
},
error: function (xhr, ajaxOptions, error) {
showtooltip(xhr.status + ': ' + error, false);
$('#loginsubmit').removeAttr("disabled");
}
});
});
そして、ほとんどのサービスはクラスオブジェクトを返します。
[WebInvoke(UriTemplate = "Login", Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
public CModel.DTO.UserSessionDTO Login(CModel.Entities.ClientAuthentication client, CModel.DTO.LoginCredentials loginfo)
{
loginfo.i = System.Web.HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
CModel.Logic.IAuthenticate svc = CModel.Logic.ConfigAndResourceComponent.Container().Resolve<CModel.Logic.IAuthenticate>();
CModel.Entities.UserSession session = svc.Login(client, loginfo);
CModel.DTO.UserSessionDTO copied = Mapper.Map<CModel.Entities.UserSession, CModel.DTO.UserSessionDTO>(session);
return copied;
}
public class UserSessionDTO
{
public string SourceIP { get; set; }
public string SessionID { get; set; }
public long UserID { get; set; }
}
例外が発生した場合:
400: Bad request
クライアント側に「」エラーが表示されます(ajaxから返されたエラー)。
ajaxに表示したかったのは、例外メッセージ「InvalidLogin」です。
私の解決策はこれですが、それでも私はそれを行う方法がわかりません。
例外がスローされると、rest-projectはエラーメッセージを作成するメソッドを呼び出し、作成されたメッセージが戻り値になります。
または、より良いアイデアがあれば、共有してください。