我试图以最通用的方式在WCF上发送异常.这是我得到的:
[ServiceContract]
interface IContract
{
[OperationContract]
void Foo();
}
class ContractImplementation: IContract
{
public void Foo()
{
try
{
Bar();
}
catch (Exception ex)
{
throw new FaultException<Exception>(ex, ex.Message);
}
}
}
Run Code Online (Sandbox Code Playgroud)
实际出现的例外Bar是:
[Serializable]
class MyException : Exception
{
// serialization constructors
}
Run Code Online (Sandbox Code Playgroud)
我在服务器端WCF日志记录中看到的错误是:
不要使用数据协定名称"MyException:http://schemas.datacontract.org/2004/07/MyException " 键入"MyException" .考虑使用DataContractResolver或将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.
到目前为止我尝试过的:
[ServiceKnownType(typeof(MyException))]
[ServiceContract]
interface IContract
{
[FaultContract(typeof(MyException))]
[OperationContract]
void Foo();
}
Run Code Online (Sandbox Code Playgroud)
但没有运气.
首先,在 MyException 中,删除 Exception 的继承并将其设为 public。
其次,当您声明服务合同时,请声明例外情况,如下所示:
[FaultContractAttribute(
typeof(MyException),
Action = "",
Name = "MyException",
Namespace = "YourNamespace")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)]
[OperationContract]
void Foo()
Run Code Online (Sandbox Code Playgroud)
最后,你可以像这样抛出异常:
throw new FaultException<MyException>
(
new MyException(ex.Message),
new FaultReason("Description of your Fault")
);
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
1498 次 |
| 最近记录: |