Я искал так много ссылок, но ни одна из них на самом деле не работает, и большинство из них не дают правильный клиентский код.Есть что-то, чего мне не хватает.
У меня ниже класса исключений
[DataContract]
public class MyException
{
public MyException(Exception ex)
{
Message = ex.Message;
StackTrace = ex.StackTrace;
ExceptionType = ex.GetType();
}
[DataMember]
public string Message { get; set; }
[DataMember]
public string StackTrace { get; set; }
//[DataMember]
// This is having issues. On client side WebException.Response is null
//public Type ExceptionType { get; set; }
}
Мой интерфейс похож на
[OperationContract]
[WebInvoke(
Method = "POST",
UriTemplate = "/Documents/getallunprinteditems",
BodyStyle = WebMessageBodyStyle.Bare,
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json
)]
MyResponse MyMethod(MyRequest request);
Моя реализация похожа на
public MyResponse MyMethod(MyRequest request)
{
try
{
...
// for testing created a dividebyzero exception
}
catch(Exception ex)
{
MyException ex = new MyException(ex);
throw new WebFaultException<MyException>(ex,
System.Net.HttpStatusCode.HttpVersionNotSupported);
}
}
У меня есть код ниже на моей стороне клиента, но он всегда идет, чтобы поймать блок Исключения.Чего мне не хватает?
try
{
MyRequest upRequest = new MyRequest();
....
MyResponse upResponse = new MyResponse();
string url = "http://localhost:2023/myservice/getdata";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "application/json";
byte[] data = Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(upRequest));
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream respStream = response.GetResponseStream();
StreamReader reader = new StreamReader(respStream);
string responseData = reader.ReadToEnd();
Newtonsoft.Json.JsonConvert.PopulateObject(responseData, upResponse);
......
}
catch (System.ServiceModel.Web.WebFaultException<MyException> ex)
{
throw ex;
}
//below is just for test purpose...
catch (System.ServiceModel.FaultException<MyException> ex)
{
throw ex;
}
catch (Exception ex)
{
throw ex;
}
ОБНОВЛЕНИЕ : Как обработать WebFaultException для возврата CustomException?
Я добавил ниже на стороне клиента, и этобьет по этому.
catch (WebException ex)
{
if(ex.Response != null)
{
string errorString = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
MyException ex1 = new MyException();
Newtonsoft.Json.JsonConvert.PopulateObject(errorString, ex1);
}
}
РЕШЕНИЕ :
Проблема была с нижеприведенным свойством
[DataMember]
public Type ExceptionType { get; set; }
ErrorDetails должен быть сериализуемыми объектами и выглядит так, как будто Type не является.