c# – 如何处理WebFaultException以返回CustomException?

前端之家收集整理的这篇文章主要介绍了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服务,我在抛出自定义异常时没有任何问题.
但是在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,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.
谢谢你的回答.

解决方法

使用HttpWebRequest(或Javascript客户端)时,您的自定义异常对它们没有意义.只是Http错误代码(如500内部服务器错误)和响应内容中的数据.

所以你必须自己处理异常.例如,如果捕获WebException,则可以根据服务器配置读取Xml或Json格式的内容(错误消息).

catch (WebException ex)
{
    var error = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
    //Parse your error string & do something
}
原文链接:https://www.f2er.com/csharp/99289.html

猜你在找的C#相关文章