WCF RESTful Service - полный пример POST- WebFaultException - PullRequest
0 голосов
/ 27 декабря 2018

Я искал так много ссылок, но ни одна из них на самом деле не работает, и большинство из них не дают правильный клиентский код.Есть что-то, чего мне не хватает.

У меня ниже класса исключений

[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);
    }
 }

enter image description here

РЕШЕНИЕ :

Проблема была с нижеприведенным свойством

[DataMember]
public Type ExceptionType { get; set; }

ErrorDetails должен быть сериализуемыми объектами и выглядит так, как будто Type не является.

...