c# – 如何处理WebFaultException以返回CustomException?
我做了我的自定义异常,每次发生错误时都会抛出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服务,我在抛出自定义异常时没有任何问题. 以下是抛出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; } REST服务示例(登录方法): [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并检索响应: 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服务的响应中看到的. [WebException: The remote server returned an error: (500) Internal Server Error.] System.Net.HttpWebRequest.GetResponse() +6115971 我抛出一个WebFaultException,但我收到一个WebException. 解决方法
使用HttpWebRequest(或Javascript客户端)时,您的自定义异常对它们没有意义.只是Http错误代码(如500内部服务器错误)和响应内容中的数据.
所以你必须自己处理异常.例如,如果捕获WebException,则可以根据服务器配置读取Xml或Json格式的内容(错误消息). catch (WebException ex) { var error = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd(); //Parse your error string & do something } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |