WCF FaultException ‹T› (договор об ошибке) - .NET Core 2.2

Не поддерживаются ли контракты об ошибках с FaultException ‹T> в .NET Core 2.2?

У меня есть ссылка на службу WCF - этот точный код не тестировался, но simular хорошо работает в .NET Standard 4.6.2.

Сторона сервера:

[OperationContract]
[FaultContract(typeof(MyErrorType))]
[WebInvoke(
      Method = "GET",
      UriTemplate = "/GetData?foo={foo}",
      BodyStyle = WebMessageBodyStyle.Bare,
      RequestFormat = WebMessageFormat.Json,
      ResponseFormat = WebMessageFormat.Json)]
ExpectedReturnType GetData(int foo);

[DataContract]
[Serializable]
public class MyErrorType
{
    [DataMember]
    public int ErrorCode { get; set; }

    [DataMember]
    public string Description { get; set; }
}   

try {
   return GetData(123);
}
catch (Exception e)
{
    throw new FaultException<MyErrorType>(new MyErrorType() { ErrorCode  = 20,  Description = "Server side error message returning to client" });
}

Сторона клиента

try 
{
   _client.GetData(123);
}
catch (FaultException <MyErrorType> e)
{
  // NEVER ENDS UP HERE IN .NET Core 2.2
  // works fine in .NET Standard 4.6.2 
  Console.WriteLine(e.Details.ErrorCode);
  Console.WriteLine(e.Details.Description);
  throw e;
}
catch (Exception e)
{
  throw e;
}

person Henkolicious    schedule 11.04.2019    source источник


Ответы (1)


Я сейчас наткнулся на ту же проблему. На данный момент я сделал это обходное решение, которое, кажется, работает для меня.

catch (FaultException<WarehouseFault> faultException) 
{
    // FaultException is not supported in .Net Core as far as I know. 
    // So for now code is moved in general Exception handling below which seems to work.
    throw new Exception(".Net Core now seem to support FaultException!");
}
catch (Exception e) 
{
    if (e.InnerException is FaultException<WarehouseFault> faultException) { 
        // Handle the fault exception here.
    }

    // Other exceptions
}
person Magnus Wallström    schedule 13.03.2020