我做了我的自定义异常,每次发生错误时都会抛出try-catch:
[Serializable] public class CustomException : Exception { public CustomException() { } public CustomException(string message) : base(message) { } public CustomException(string message,Exception innerException) : base(message,innerException) { } }
我有两个服务,REST和SOAP.对于SOAP服务,我在抛出自定义异常时没有任何问题.
但是在REST中,我遇到了很多困难.
以下是抛出WebFaultException的方法:
public static WebFaultException RestGetFault(ServiceFaultTypes fault) { ServiceFault serviceFault = new ServiceFault(); serviceFault.Code = (int)fault; serviceFault.Description = ConfigAndResourceComponent.GetResourceString(fault.ToString()); FaultCode faultCode = new FaultCode(fault.ToString()); FaultReasonText faultReasonText = new FaultReasonText(serviceFault.Description); FaultReason faultReason = new FaultReason(faultReasonText); WebFaultException<ServiceFault> webfaultException = new WebFaultException<ServiceFault>(serviceFault,HttpStatusCode.InternalServerError); throw webfaultException; }
ServiceFault是一个类,它有一些属性,我用它来提供我需要的所有信息.
我使用此方法在REST服务中引发异常:
public static CustomException GetFault(ServiceFaultTypes fault) { string message = fault.ToString(); CustomException cusExcp = new CustomException(message,new Exception(message)); throw cusExcp; }
[WebInvoke(UriTemplate = "Login",Method = "POST",ResponseFormat = WebMessageFormat.Json,RequestFormat = WebMessageFormat.Json,BodyStyle = WebMessageBodyStyle.WrappedRequest)] public Session Login(ClientCredentials client,LogCredentials loginfo) { try { // Login process return copied; } catch (LogicClass.CustomException ex) { LogicClass.RestGetFault(LogicClass.EnumComponent.GetServiceFaultTypes(ex.Message)); throw ex; } }
MVC部分:
控制器:
[HttpPost] public ActionResult Login(LoginCredentials loginfo) { try { string param = "{\"client\":" + JSonHelper.Serialize<ClientAuthentication>(new ClientAuthentication() { SessionID = Singleton.ClientSessionID }) + ",\"loginfo\":" + JSonHelper.Serialize<LoginCredentials>(loginfo) + "}"; string jsonresult = ServiceCaller.Invoke(Utility.ConstructRestURL("Authenticate/Login"),param,"POST","application/json"); UserSessionDTO response = JSonHelper.Deserialize<UserSessionDTO>(jsonresult); } catch (Exception ex) { return Json(new { status = ex.Message,url = string.Empty }); } return Json(new { status = "AUTHENTICATED",url = string.IsNullOrWhiteSpace(loginfo.r) ? Url.Action("Index","Home") : loginfo.r }); }
我使用ServiceCaller.Invoke调用REST API并检索响应:
ServiceCaller.cs
public class ServiceCaller { public static string Invoke(string url,string parameters,string method,string contentType) { string results = string.Empty; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(url)); request.Method = method; request.ContentType = contentType; if (!string.IsNullOrEmpty(parameters)) { byte[] byteArray = Encoding.UTF8.GetBytes(parameters); request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray,byteArray.Length); dataStream.Close(); } try { HttpWebResponse response = (HttpWebResponse)request.GetResponse(); if (HttpStatusCode.OK == response.StatusCode) { Stream responseStream = response.GetResponseStream(); int length = (int)response.ContentLength; const int bufSizeMax = 65536; const int bufSizeMin = 8192; int bufSize = bufSizeMin; if (length > bufSize) bufSize = length > bufSizeMax ? bufSizeMax : length; byte[] buf = new byte[bufSize]; StringBuilder sb = new StringBuilder(bufSize); while ((length = responseStream.Read(buf,buf.Length)) != 0) sb.Append(Encoding.UTF8.GetString(buf,length)); results = sb.ToString(); } else { results = "Failed Response : " + response.StatusCode; } } catch (Exception exception) { throw exception; } return results; } }
我期待REST服务在客户端返回:
但最终,它总是回归:
我该怎么办?请帮忙.
编辑
以下是调用soap服务时的示例响应:
[FaultException: InvalidLogin] System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) +9441823
你看到“InvalidLogin”吗?这就是我想在REST服务的响应中看到的.
REST的示例响应:
[WebException: The remote server returned an error: (500) Internal Server Error.] System.Net.HttpWebRequest.GetResponse() +6115971
我抛出一个WebFaultException,但我收到一个WebException.
如果我无法在REST上获取确切的错误消息,我将使用SOAP.
谢谢你的回答.