通过 WCF 抛出异常的正确方法
Proper way to throw exception over WCF
我试图以最通用的方式通过 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);
}
}
}
Bar
实际出现的异常是:
[Serializable]
class MyException : Exception
{
// serialization constructors
}
我在服务器端 WCF 日志记录中看到的错误是:
Type 'MyException' with data
contract name
'MyException:http://schemas.datacontract.org/2004/07/MyException'
is not expected. Consider using a DataContractResolver or add any
types not known statically to the list of known types - for example,
by using the KnownTypeAttribute attribute or by adding them to the
list of known types passed to DataContractSerializer.
到目前为止我尝试过的:
[ServiceKnownType(typeof(MyException))]
[ServiceContract]
interface IContract
{
[FaultContract(typeof(MyException))]
[OperationContract]
void Foo();
}
但运气不好。
首先 - 抱歉,我宁愿 post 这是评论而不是答案。作为一个相对菜鸟,我做不到!
本文相当详细地讨论了如何转发异常详细信息:http://www.codeproject.com/Articles/799258/WCF-Exception-FaultException-FaultContract
Afaik,您实际上无法将异常本身传递回客户端,因为异常不符合 SOAP。还要考虑传递整个异常是否会危及代码的安全性。
首先,在MyException中,去掉Exception的继承,使之成为public。
其次,当你声明你的服务合同时,声明异常如下:
[FaultContractAttribute(
typeof(MyException),
Action = "",
Name = "MyException",
Namespace = "YourNamespace")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)]
[OperationContract]
void Foo()
最后,您可以像这样抛出异常:
throw new FaultException<MyException>
(
new MyException(ex.Message),
new FaultReason("Description of your Fault")
);
希望对您有所帮助。
我试图以最通用的方式通过 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);
}
}
}
Bar
实际出现的异常是:
[Serializable]
class MyException : Exception
{
// serialization constructors
}
我在服务器端 WCF 日志记录中看到的错误是:
Type 'MyException' with data contract name 'MyException:http://schemas.datacontract.org/2004/07/MyException' is not expected. Consider using a DataContractResolver or add any types not known statically to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding them to the list of known types passed to DataContractSerializer.
到目前为止我尝试过的:
[ServiceKnownType(typeof(MyException))]
[ServiceContract]
interface IContract
{
[FaultContract(typeof(MyException))]
[OperationContract]
void Foo();
}
但运气不好。
首先 - 抱歉,我宁愿 post 这是评论而不是答案。作为一个相对菜鸟,我做不到!
本文相当详细地讨论了如何转发异常详细信息:http://www.codeproject.com/Articles/799258/WCF-Exception-FaultException-FaultContract
Afaik,您实际上无法将异常本身传递回客户端,因为异常不符合 SOAP。还要考虑传递整个异常是否会危及代码的安全性。
首先,在MyException中,去掉Exception的继承,使之成为public。
其次,当你声明你的服务合同时,声明异常如下:
[FaultContractAttribute(
typeof(MyException),
Action = "",
Name = "MyException",
Namespace = "YourNamespace")]
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults = true)]
[OperationContract]
void Foo()
最后,您可以像这样抛出异常:
throw new FaultException<MyException>
(
new MyException(ex.Message),
new FaultReason("Description of your Fault")
);
希望对您有所帮助。