zoukankan      html  css  js  c++  java
  • 继续Wcf记录点滴

       之前说wcf以tcp协议作为通信方式的话会出现很多奇怪的bug,今天我把自己遇到的比较特殊的一个exception和解决方案列出来。主要是自己记录一下,顺便方便遇到这个问题的有缘人吧!废话不多说直接上代码:

      首先看看我遇到的exception截图:

     

      出现这种异常属于你的服务端程序出错了,但是又看不见异常源在哪,所以你需要在你的配置文件中添加相应的配置,以便让服务的异常信息返回到客户端。

      下面两种情况:

      1.如果你的配置文件是以config文件存在的话,需要添加配置节点

     1  <behaviors>
     2             <serviceBehaviors>
     3                 <behavior name="CalculatorServiceBehavior">
     4                     <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false 并删除上面的元数据终结点-->
     5                     <serviceMetadata httpGetEnabled="true"/>
     6                     <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息-->
     7                     <serviceDebug includeExceptionDetailInFaults="true"/>
     8                 </behavior>
     9             </serviceBehaviors>
    10         </behaviors>
    View Code

     关键<serviceDebug includeExceptionDetailInFaults="true"/>
    2.如果你是配置文件以代码的形式配置的话这个可能会比较麻烦。因为我的配置文件也是代码的形式配置的(ServcieHost),所以在添加这个节点配置的时候遇到了点小问题:

    刚开始不了解ServcieHost,我单步调试进去看了一下ServiceHost的结构信息,我截图给大家看看吧

       我们可以看到已经有6个behavior了,红框部分就是前面说在config文件需要配置的节点。而且他的IncludeExceptionDetailInFaults默认值为false。恍然大悟,就是因为这个false所以在客户端看不见异常信息的源了。我需要将他修改成true,怎么修改了?且看代码:

    1  ServiceDebugBehavior debugBehavior = srvHost.Description.Behaviors[typeof(ServiceDebugBehavior)] as ServiceDebugBehavior;
    2 debugBehavior.IncludeExceptionDetailInFaults = true;
    3 srvHost.Description.Behaviors.add(debugBehavior);
    View Code

    这几行代码添加好后,心想这样应该在客户端就可以看见异常信息了吧:事实证明我还是"图样图森破"。结果又跑异常了!

      前面刚刚讲到,ServiceHost默认有几个behavior了,再往里面添加不就炸了吗?所以换种方式,程序员最不缺少的是啥,就是想法呀!哈哈。这次我换了种方式。

    1 ServiceDebugBehavior debugBehavior = srvHost.Description.Behaviors[typeof(ServiceDebugBehavior)] as ServiceDebugBehavior;
    2 debugBehavior.IncludeExceptionDetailInFaults = true;
    3 for (int i = 0; i < srvHost.Description.Behaviors.Count; i++)
    4 {
    5      if (srvHost.Description.Behaviors[i].ToString() == "System.ServiceModel.Description.ServiceDebugBehavior")
    6          {
    7               srvHost.Description.Behaviors[i] = debugBehavior;
    8             }
    9   }
    View Code

    哈哈,再调试,果然服务端的异常信息抛出来了,由于服务端找不到我程序的某个文件了,wcf不干了,但是为了安全,所以客户端只说是内部错误!异常找到了,结果就是解决咯!大功告成!
    【转载注明出处!谢谢】

  • 相关阅读:
    代码review之 isInfoEnable()
    sdk、jdk、jre、jvm、jdt、cdt分别都是什么东西
    思考总结: 决胜21点 开篇 概率问题
    Java多线程开发系列之四:玩转多线程(线程的控制2)
    Java多线程开发系列之四:玩转多线程(线程的控制1)
    Java多线程开发系列之三:线程这一辈子(线程的生命周期)
    Java多线程开发系列之二:如何创建多线程
    [系列] Gin框架
    [系列] Gin框架
    [系列] Gin 框架
  • 原文地址:https://www.cnblogs.com/stoneWl/p/5810038.html
Copyright © 2011-2022 走看看