【问题标题】:WCF method called twiceWCF 方法调用了两次
【发布时间】:2011-02-09 18:40:18
【问题描述】:

我有一个将数据返回到桌面应用程序的 Web 服务。我遇到的问题是,当 Web 服务返回少量数据时,一切正常,但是当数据量很大时,它会引发以下异常:

System.Net.WebException:底层连接已关闭:接收时发生意外错误。

当我调试 Web 服务时,我看到这个特定的方法被调用了两次。它第一次执行 return 语句没有任何反应,但是当它第二次执行它时,桌面应用程序中会抛出上述异常。

我之前在 stackoverflow 上发现过类似的帖子,但它们并没有解决我的问题。谁能告诉我这里发生了什么?

谢谢!

【问题讨论】:

  • 您是在客户端还是服务器上收到此异常?我认为它在客户端。在这种情况下,您需要查看 Windows 事件日志以了解服务器中发生的情况。您还可以打开 WCF 跟踪以查看服务中发生了什么。
  • Windows 事件日志中没有此异常。你能帮我如何跟踪Web服务吗?我以前从未这样做过。即使您可以将示踪剂的链接转发给我,它也会有很大帮助。谢谢

标签: wcf web-services system.net.webexception


【解决方案1】:

我遇到了与 OP 完全相同的症状,但我的目标是我无法控制的 Oracle Web 服务。 WebService 调用在独立的测试 Web 应用程序中运行良好,但在需要实现的 .NET 应用程序中却不行。

我不明白为什么,但是将 web.config 中的 targetFramework 从 4.5 更新到 4.6.1 解决了我的应用程序的问题。

<httpRuntime targetFramework="4.5" requestValidationMode="4.5" executionTimeout="36000" />

<httpRuntime targetFramework="4.6.1" requestValidationMode="4.5" executionTimeout="36000" />

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,我的解决方案与 Batgar 的类似,但有所不同。我有一个类具有object 类型的属性。对于对象可以包含的每种类型,我必须将KnownType 属性添加到类中。我无法即时填充KnownType,因为该类不知道该对象将包含什么。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题。事实证明 WCF 无法将 DateTime 作为 JSON 返回,所以我必须将其设为 Nullable<DateTime>

      【讨论】:

        【解决方案4】:

        我也有这个问题。对我来说,这是因为我有一个[DataMember] 属性和get{},但没有set{}。添加set{} 后,此行为停止。

        【讨论】:

        • 非常感谢!这解决了我的问题。我不明白为什么会影响它。
        • 您好,我也遇到了与 get{} 但没有 set{} 相同的问题。该属性的真正含义是 vo 属性
        【解决方案5】:

        我最近遇到了这个问题,结果我忘记用 [DataContract] 标记其中一个数据传输类

        【讨论】:

          【解决方案6】:

          我最近遇到了这个问题。

          事实证明,分析由 System.Diagnostics.XmlWriterTraceListener 编写的 WCF 日志导致我设置的数据协定出现问题。

          我要返回Dictionary<int, object>(旁注:是的,我知道这真的很糟糕!但我还年轻,需要钱)。我忘记在 DataContract 的返回值中包含 [KnownType] 属性:

              [DataContract]
              [KnownType(typeof(Dictionary<int, double>))]
              [KnownType(typeof(Dictionary<int, ChannelData>))]
              [KnownType(typeof(Dictionary<string, Dictionary<int, double>>))]
              public class MyCoolObject: ICoolObject
              {
          [DataMember]
                  public Dictionary<string, object> Results
                  {
                      get { return _results; }
                      set { _results = value; }
                  }
              }
          

          【讨论】:

            【解决方案7】:

            这可能是因为邮件大小大于默认邮件大小。您可以在端点的配置中尝试increasing the this value。你也可以看看this post


            更新:

            为了进一步诊断问题,我建议您通过将以下内容放入配置文件中来激活服务上的跟踪:

            <system.diagnostics>
                <trace autoflush="true">
                </trace>
                <sources>
                    <source name="System.ServiceModel"
                            switchValue="Information, ActivityTracing"
                            propagateActivity="true">
                        <listeners>
                            <add name="sdt"
                                 type="System.Diagnostics.XmlWriterTraceListener"
                                 initializeData="WcfDetailTrace.e2e" />
                        </listeners>
                    </source>
                </sources>
            </system.diagnostics>
            

            这将生成WcfDetailTrace.e2e 跟踪文件,您可以使用Service Trace Viewer Tool 打开该文件,该文件将为您提供有关调用和错误消息的大量信息。

            【讨论】:

            • 大小不是问题。我将大小设置为 16 MB,并且正在传输的数据小于该大小。我已经看过提到的两个帖子,但似乎没有帮助。请问还有什么建议吗?谢谢..
            • @DarinDimitrov 这个救了我的命和项目,不知道出了什么问题。在跟踪中发现 EF-Entity 不是数据合约。谢谢! :)
            • @DarinDimitrov ..此链接不可用,请您更新您的答案,stackoverflow 不喜欢链接,所以尝试为链接 + 链接添加一个 breif
            猜你喜欢
            • 2017-10-15
            • 1970-01-01
            • 1970-01-01
            • 2023-03-28
            • 2011-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多