c# - 如果为 ApplicationException 指定了内部异常,则 WCF FaultException<ApplicationException> 失败

标签 c# wcf faultexception

我一直在调试我新创建的 WCF 服务故障合约的问题,并最终找到了问题所在。

我这样定义服务:

[ServiceContract]

public interface IService1
{

    [OperationContract]
    [FaultContract(typeof(ApplicationException))]
    string GetData();
}

在我的服务中,我是这样处理服务中的异常的:

    public string GetData()
    {
        try
        {
           // do stuff
        }
        catch(Exception e)
        {
            ApplicationException ae = new ApplicationException("oh dear!", e );
            throw new FaultException<ApplicationException>( ae, 
                                                 new FaultReason(ae.Message));
        }
    }

但是,客户端永远不会收到故障异常,而是会收到一个异常:

An error occurred while receiving the HTTP response to ... This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server ( possibly due to the service shutting down).See server logs for more details

如果我像这样更改我在服务上的代码(即:在构造 ApplicationException 时不要设置内部异常)它会按预期工作。

    public string GetData()
    {
        try
        {
           // do stuff
        }
        catch(Exception e)
        {
            ApplicationException ae = new ApplicationException("oh dear!");
            throw new FaultException<ApplicationException>( ae, 
                                                 new FaultReason(ae.Message));
        }
    }

如果设置了内部异常,谁能解释为什么这可能会失败?我在文档中的任何地方都看不到它。

最佳答案

ApplicationException通过 FaultException<T> 发送给客户端没有 InnerException , 然后它仅作为 string 发送.但是,当 InnerException已设置,则 ApplicationException本身被发送。

Exception类型在 .NET 中是可序列化的(它经常被错误地引用为不可序列化),但是, Data 的内容通常是属性不可序列化。这将导致序列化问题,我相信您正在遇到这种情况。

此问题有一些解决方法:您可以设置 Data属性(property)null通过使用反射或者你可以创建自己的类。

关于c# - 如果为 ApplicationException 指定了内部异常,则 WCF FaultException<ApplicationException> 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22446096/

相关文章:

c# - TCP套接字测试

c# - 我的 AAD 身份验证回复网址有什么问题吗?

wcf - 在 ServiceModel 客户端配置部分找不到名称为 ' and contract ' I' 的端点元素。

c# - 序列化一个通用类型的 FaultException

c# - 将 Entity Framework 实体映射到 POCO 并维护层次结构

asp.net - 使用 WCF 和 ASP.NET Web 表单传输大文件

asp.net - 无法使用权​​限 'site.com' 为 SSL/TLS 建立安全通道

.net - 自定义异常作为故障异常中的详细信息

当抛出FaultException时WCF抛出CommunicationException

c# - 如何从代码隐藏中将 CSS 类添加到 asp.net