WCF CommunicationException 没有异常消息详细信息

2024-06-26

我从来不理解 WCF 的一件事是,当服务器遇到未处理的异常时,为什么没有异常消息详细信息传播回调用客户端。

例如,如果我有以下服务器代码

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class Server : IServer
{
    public DTO GetDTO()
    {
        DTO dto = new DTO();
        dto.dto = dto;
        return dto;
    }

}

public class DTO
{
    public DTO dto;
}

[ServiceContract]
public interface IServer
{
    [OperationContract]
    DTO GetDTO();
}

我特意引入了一个ObjectGraph,以便在返回DTO对象时引发序列化异常。

如果我有一个客户端调用该服务器的GetDTO()方法,我会得到以下CommunicationException.

套接字连接被中止。这可能是由错误引起的 正在处理您的消息或超出了接收超时 远程主机或底层网络资源问题。本地套接字 超时为“00:00:58.9350000”。

这是绝对没用的。它没有内部异常,甚至没有真正的异常消息。

如果您随后使用 Microsoft Service TraceViewer,您将看到异常,但您必须为此打开诊断跟踪。

应该发回的异常消息是

尝试序列化参数时出错http://tempuri.org/:GetDTOResult http://tempuri.org/:GetDTOResult。 InnerException 消息是 'TestWCFLib.DTO'类型的对象图包含循环并且不能 如果参考跟踪被禁用,则序列化。'。请参见 有关更多详细信息,请参阅 InnerException。

那么有人可以告诉我如何在客户端显示正确的异常消息吗?显然,设置IncludeExceptionDetailInFaultstrue 没有什么区别。


我认为服务器错误不会传播到客户端是有意设计的。通常,这是一种不向客户端公开服务器内部结构的做法,因为客户端服务器体系结构的主要目的是服务器的独立性。

您仍然可以通过使用来实现此目的故障异常 http://msdn.microsoft.com/en-us/library/system.servicemodel.faultexception%28VS.85%29.aspx/

用故障合同装饰您的服务声明

[ServiceContract]
public interface IServer
{
    [OperationContract]
    [FaultContract(typeof(MyApplicationFault))]
    DTO GetDTO();
}

然后捕获服务实现中的错误并抛出错误异常。

[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class Server : IServer
    {
        public DTO GetDTO()
        {
            try
              {
                   DTO dto = new DTO();
                   dto.dto = dto;
                   return dto;
               }
            catch (Exception ex)
                 {
                     MyApplicationFault fault = new MyApplicationFault(...);
                     throw new FaultException<MyApplicationFault>(fault);
                 }
        }

    }

并在客户端捕获异常

IServer proxy = ...;    //Get proxy from somewhere
try 
{
    proxy.GetDTO();
}
catch (TimeoutException) { ... }
catch (FaultException<MyApplicationFault> myFault) {
    MyApplicationFault detail = myFault.Detail;
    //Do something with the actual fault
}
catch (FaultException otherFault) { ... }
catch (CommunicationException) { ... }

希望这可以帮助。 如需精彩教程,请参阅关于Fault异常的代码项目教程 http://www.codeproject.com/Articles/26320/WCF-Error-Handling-and-Fault-Conversion/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WCF CommunicationException 没有异常消息详细信息 的相关文章

  • 如何唯一标识会话 0 中运行的 Internet Explorer 窗口?

    我正在创造WCF web services自动化internet explorer 有多个Web服务调用需要访问同一个实例Internet Explorer 然而 自从WCF服务托管于IIS所有对 Web 服务的调用都在会话 0 中执行 现
  • 使用 NSubstitute 模拟动作

    Web 服务的代理需要进行单元测试 而无需 显然 访问 Web 服务 这就是我想要绝育的方法 public void Invoke Action
  • WCF 发现根本不起作用

    我正在尝试将临时发现添加到简单的 WCF 服务客户端设置 当前通过控制台应用程序中的自托管实现 在 Windows 7 上使用 VS2010 进行调试 并执行我在在线教程中可以找到的任何操作 但发现客户端仍然什么也没找到 不用说 如果我打开
  • 使用 WCF 的契约优先 SOA

    这个问题更多的是探索人们在社区中 在实际情况中所做的事情 而不是一个有针对性的问题 我对此进行了相当广泛的搜索 虽然我发现很多博主都提倡契约优先的服务设计 并且有一些评论支持它们 但我还没有找到很多关于使用 WCF 实现契约优先的实用信息
  • 使用 netMSMQ 绑定进行有序交付

    使用 WCF netMSMQbinding 时是否可以保证有序交付 我们将一个插入命令后跟多个更新命令放在同一个队列上 有时其中一个更新会击败插入命令 添加了广泛的日志记录后 很明显它们正在以正确的顺序添加到队列中 并以不同的顺序进行处理
  • 无法在 Windows 8 上的 IIS 中提供 WCF 服务

    当我尝试在 Windows 8 计算机中的 IIS 上提供 WCF 服务时 出现众所周知的错误 由于扩展配置的原因 无法提供您请求的页面 如果页面是脚本 请添加处理程序 如果应下载该文件 请添加 MIME 映射 旧的解决方法是运行aspne
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • WCF MaxReceivedMessageSize 属性未采用

    搜索了一下 没有运气 我不断得到 已超出传入消息的最大消息大小配额 65536 要增加配额 请使用相应绑定元素上的 MaxReceivedMessageSize 属性 这是有道理的 所以我进入服务器和客户端配置并进行更改 Client
  • SVCUtil“更新服务参考”等效命令参数

    我想使用 SVCUtil 更新 Visual Studio 2010 解决方案中的服务引用 因为该解决方案有多个项目 并且一一刷新引用并不好 我想知道您的观点 因为我必须确保执行与 Visual Studio 2010 执行的命令完全相同的
  • WCF 服务 Process.Start 在网络服务帐户下模拟不同用户

    我在 IIS Windows Server 2008 R2 中托管了 Wcf 服务 使用带有网络服务标识的 AppPool NET 4 0 我的 Wcf 服务有一个使用 Process Start 调用命令 EXE 的方法 我需要使用不同的
  • WCF 服务调用包装器

    为 WCF 服务调用创建包装器的最佳实践是什么 我认为有必要 为了在同一个地方监视所有呼叫 我正在考虑使用这种代码 这是正确的想法吗 RetType t ServiceExecutionContext
  • 运行批处理文件的 C# 代码可以在控制台应用程序中运行,但相同的代码不能在 WCF 服务中运行

    以下代码非常简单 并且可以在控制台应用程序中运行 但由于某种原因 它在 WCF 服务中不起作用 批处理文件所在目录具有完全权限 有人能帮我吗 我缺少什么 try ProcessStartInfo psi new ProcessStartIn
  • 访问WCF服务时触发MaxClockSkew

    我有一项 WCF 服务 其一个端点的 MaxClockSkew 配置设置为 23 59 59 但没有安全行为 另一个端点具有相同的 MaxClockSkew 配置和安全配置 问题是当访问非安全端点时不会引发异常 而当访问安全端点时会引发安全
  • WCF 服务 - 启动需要额外时间

    我发现 WCF 服务将需要 8 10 秒来加载第一个命中 之后将需要不到一秒钟的时间 有什么想法吗 可能是由于 NET 的冷启动 您是否考虑过设置IIS 预热模块它在初始请求之前初始化依赖项 来自学习IIS网站 http learn iis
  • 我们可以将工作流服务托管为 Windows 服务吗?

    我正在开发一个日志记录应用程序 它要求我有一个作为服务公开的工作流 工作流服务 我们希望将其托管为 Windows 服务 不希望将工作流服务托管为 IIS 中的 svc 文件 将其作为 Windows 服务的另一个原因是能够通过命名管道与服
  • 上传大型 xml 到 WCF REST 服务 -> 400 错误请求

    我一直在尝试寻找这个错误 但到目前为止还没有运气 所以我的客户端上有一个带有此 web config 的服务
  • 如何在WCF请求和响应的soap标头中添加MessageID?

    企业移动设备管理协议在HTTP POST 请求中显示以下soap xml 如何将我的 Web 服务定义为要包含的肥皂头Action MessageID ReplyTo 和 To在请求和响应中 我尝试在 MessageCOntract 中定义
  • WCF、Rest 和 SOAP 之间是什么关系?

    WCF和REST SOAP是什么关系 WCF 是基于其中一种技术 REST 或 SOAP 还是一种单独的技术 WCF 是一个用于构建分布式系统的消息传递框架 分布式系统是mostly只是网络服务的另一种说法 这意味着您可以用 C 或任何 N
  • 指定自定义序列化程序时,错误详细信息未反序列化

    我正在使用自定义XmlObjectSerializer在我的应用程序中 为此 我替换XmlSerializerOperationBehavior with MyOperationBehavior看起来像这样 public class MyO
  • 如何强制 Unity 创建一个新实例?

    使用 Unity 应用程序块 当我们调用时 如何强制 Unity 配置创建对象的新实例UnityContainer Resolve

随机推荐