如何处理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服务,我在抛出自定义异常时没有任何问题。 但在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;
}
示例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并检索响应: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, 0, 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, 0, buf.Length)) != 0)
sb.Append(Encoding.UTF8.GetString(buf, 0, 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 servivce的响应。
来自REST的示例响应:
[WebException: The remote server returned an error: (500) Internal Server Error.]
System.Net.HttpWebRequest.GetResponse() +6115971
我抛出一个WebFaultException
但我收到一个WebException
。
如果我无法在REST上获取确切的错误消息,我会去使用SOAP。
感谢您的答案。
当使用HttpWebRequest
(或Javascript客户端)时,您的自定义异常对他们来说没有意义。 只是Http错误代码(如500内部服务器错误)和响应内容中的数据。
所以你必须自己处理这个例外。 例如,如果您捕获WebException
,则可以使用Xml或Json格式读取内容(错误消息),具体取决于您的服务器配置。
catch (WebException ex)
{
var error = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
//Parse your error string & do something
}
我几分钟前就有过类似的问题。 也许它有帮助。 我正在尝试为我所有的服务调用使用扩展名,如下所示:
这是坏的一段代码:
public static void ExecuteServiceMethod(this IMyRESTService svc, Action svcMethod)
{
try
{
// try to get first last error here
string lastError = svc.CommHandler.CH_TryGetLastError();
if (!String.IsNullOrEmpty(lastError))
throw new WebFaultException<string>(lastError, System.Net.HttpStatusCode.InternalServerError);
// execute service method
svcMethod();
}
catch (CommHandlerException ex)
{
// we use for now only 'InternalServerError'
if (ex.InnerException != null)
throw new WebFaultException<string>(ex.InnerException.Message, System.Net.HttpStatusCode.InternalServerError);
else
throw new WebFaultException<string>(ex.Message, System.Net.HttpStatusCode.InternalServerError);
}
catch (Exception ex)
{
throw new WebFaultException<string>(ex.Message, System.Net.HttpStatusCode.InternalServerError);
}
}
这是固定的一段代码:
public static void ExecuteServiceMethod(this IMyRESTService svc, Action svcMethod)
{
// try to get first last error here
string lastError = svc.CommHandler.CH_TryGetLastError();
if (!String.IsNullOrEmpty(lastError))
throw new WebFaultException<string>(lastError, System.Net.HttpStatusCode.InternalServerError);
try
{
// execute service method
svcMethod();
}
catch (CommHandlerException ex)
{
// we use for now only 'InternalServerError'
if (ex.InnerException != null)
throw new WebFaultException<string>(ex.InnerException.Message, System.Net.HttpStatusCode.InternalServerError);
else
throw new WebFaultException<string>(ex.Message, System.Net.HttpStatusCode.InternalServerError);
}
catch (Exception ex)
{
throw new WebFaultException<string>(ex.Message, System.Net.HttpStatusCode.InternalServerError);
}
}
所以...可能你注意到第一次throw
,被处理成catch (Exception ex)
块,它再次抛出,使其始终显示: '内部服务器错误 '。 也许它有帮助,因为我看到你也有一个全球性的
catch(异常异常){抛出异常; }
这可能是它的原因。
1)将错误合同添加到方法/操作
2)抛出WebFaultException或WebFaultException
3)在客户端捕捉到webexception,然后读取异常响应
catch (WebException exception)
{
var resp = new StreamReader(exception.Response.GetResponseStream()).ReadToEnd();
}
问题陈述中提到的问题面临同样的问题,可以用LB提及的答案和其他几个帖子解决。 所以总结了以下步骤
链接地址: http://www.djcxy.com/p/60095.html上一篇: How to Handle WebFaultException to return CustomException?