gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:31:25 25 4
gpt4 key购买 nike

我创建了自定义异常,每次发生错误时都会在 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 部分:

Controller :

    [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 并检索响应:服务调用者.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 服务在客户端返回这个:

enter image description here

但最后,它总是返回:

enter image description here

我该怎么办?请帮忙。

编辑

以下是调用 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 Internal server error)和响应内容中的数据。

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

catch (WebException ex)
{
var error = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
//Parse your error string & do something
}

关于c# - 如何处理 WebFaultException 以返回 CustomException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10797041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com