WCF方法被调用两次。

15
我有一个 Web 服务向桌面应用返回数据。我的问题是,当 Web 服务返回小量数据时一切正常,但当数据量大时会抛出以下异常:

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

当我调试 Web 服务时,我发现这个特定的方法被调用了两次。第一次执行 return 语句时什么也没发生,但当它第二次执行时,桌面应用程序中抛出了上述异常。
我在 stackoverflow 上找到了类似的帖子,但它们没有解决我的问题。有人能告诉我这里发生了什么吗?
谢谢!

你是在客户端还是服务器上收到这个异常?我认为是在客户端。如果是这样,你需要查看Windows事件日志以了解服务器上发生了什么。你也可以打开WCF跟踪来查看服务中发生了什么。 - John Saunders
这个异常在Windows事件日志中没有任何记录。 请问您如何跟踪Web服务。我以前从未做过这样的事情。即使您可以为我提供一个跟踪器的链接,那也将是非常有帮助的。谢谢。 - Saurabh Lalwani
7个回答

12

可能是因为消息的大小超过了默认的消息大小。您可以尝试在端点的配置中增加此值。您还可以查看这篇文章


更新:
为了进一步诊断问题,我建议您在配置文件中添加以下内容来激活服务的跟踪功能:
<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,而传输的数据少于此值。 我已经查看了两篇提到的文章,但好像没有帮助。还有其他建议吗? 谢谢。 - Saurabh Lalwani
1
@DarinDimitrov 这个救了我的命和项目,我一直搞不清楚问题出在哪里。在跟踪中发现EF-Entity不是数据合同。谢谢! :) - Hitin
@DarinDimitrov..此链接不可用,您能否更新您的答案?stackoverflow不喜欢链接,因此请尝试添加链接的简要说明+链接。 - Mohamad Mahmoud Darwish

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; }
        }
    }

5

我也曾遇到过这个问题。对我而言,是因为我有一个带有[DataMember]属性的get{}但没有set{}。在添加set{}后,这种情况停止了。


非常感谢!这解决了我的问题。我不明白为什么会影响它。 - Husain
嗨,我也遇到了一个只有get{}但没有set{}的问题。这个属性真正意义上是什么呢?VO属性。 - Veeresh123

2

我遇到了同样的问题,原来是因为WCF无法将DateTime以JSON格式返回,所以我不得不将其改为Nullable<DateTime>


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

1

最近我遇到了这个问题,结果发现我忘记给其中一个数据传输类打上[DataContract]标记。


0

我遇到了与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" />


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接