私は今日これに遭遇しました。解決策は、FaultContractのExceptionから継承しないオブジェクトを使用することでした。 FaultExceptionとFaultContractのMSDNドキュメントを見ると、公式の例では、FaultException.DetailのExceptionを拡張するクラスではなく、プレーンクラス(DataContact属性を使用)が使用されていることがわかります。私はなぜ例外が原因でAdd Service Referenceが失敗するのか分かりませんが、それはシリアライズやカスタム例外の型情報の取得と関係があります。私は、実際のアプローチを実証するために、実装前と実装後の例を取り上げました。彼のコードを使用するためのMax Striniし、解決策を見つけるのに役立ちます。(勤務)
[ServiceContract]
public interface IMyService
{
[OperationContract]
[FaultContract(typeof(MyException))]
MyResults MyServiceOperation(string myParameter);
}
[Serializable]
public class MyException : Exception
{
public string CustomData { get; set; }
}
[ErrorHandlerBehavior(typeof(MyErrorHandler))]
public class MyService : IMyService
{
public MyResults MyServiceOperation(string myParameter)
{
...
throw new MyModelException { CustomData = "42" };
...
}
}
public class MyErrorHandler : IErrorHandler
{
public bool HandleError(Exception error) { return false; }
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
try { throw error; }
catch (MyModelException ex)
{
var faultEx = new FaultException<MyException>(new MyException { CustomData = ex.CustomData });
fault = Message.CreateMessage(version, faultEx.CreateMessageFault(), faultEx.Action);
}
catch { /* Supress all others */ }
}
}
後:
[ServiceContract]
public interface IMyService
{
[OperationContract]
[FaultContract(typeof(MyFault))]
MyResults MyServiceOperation(string myParameter);
}
[DataContract]
public class MyFault
{
[DataMember]
public string CustomData { get; set; }
}
[ErrorHandlerBehavior(typeof(MyErrorHandler))]
public class MyService : IMyService
{
public MyResults MyServiceOperation(string myParameter)
{
...
throw new MyModelException { CustomData = "42" };
...
}
}
public class MyErrorHandler : IErrorHandler
{
public bool HandleError(Exception error) { return false; }
public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
{
try { throw error; }
catch (MyModelException ex)
{
var faultEx = new FaultException<MyFault>(new MyFault { CustomData = ex.CustomData });
fault = Message.CreateMessage(version, faultEx.CreateMessageFault(), faultEx.Action);
}
catch { /* Supress all others */ }
}
}
ソースを
前(動作しませんでした)この問題に。
あなたは_もちろん、例外は.NET以外のプラットフォームでは無意味であることを認識していますか? –
私の印象は、WCFフレームワークのために例外からの無関係が必要であったという印象はありません。 Exceptionから継承したカスタム例外の正しいプロキシクラスを常に作成できるので、私は正しいとも思っています。 – SpoBo