我有一个将数据返回到桌面应用程序的Web服务。我遇到的问题是,当Web服务返回少量数据时,一切正常,但是当数据量很大时,它会抛出以下异常:
System.Net.WebException:底层连接已关闭:接收时发生意外错误。
当我调试Web服务时,我看到这个特殊方法被调用了两次。它在第一次没有任何反应时执行return语句,但是当它第二次执行它时,桌面应用程序中会抛出上述异常。
我之前在stackoverflow上发现了类似的帖子,但是他们没有解决我的问题。有人可以告诉我这里发生了什么吗?
谢谢!
答案 0 :(得分:12)
可能是因为邮件的大小大于默认邮件大小。您可以在端点配置中尝试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打开该文件,该文件将为您提供有关呼叫和错误消息的详细信息。
答案 1 :(得分: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; }
}
}
答案 2 :(得分:5)
我也有这个问题。对我来说,它发生了,因为我有一个[DataMember]
属性get{}
但没有set{}
。添加set{}
后,此行为已停止。
答案 3 :(得分:2)
我遇到了同样的问题。事实证明,WCF无法将DateTime
作为JSON返回,因此我必须将其设为Nullable<DateTime>
。
答案 4 :(得分:1)
我最近遇到了这个问题,结果发现我忘记用[DataContract]标记其中一个数据传输类
答案 5 :(得分:1)
我也有这个问题,我的解决方案与Batgar相似,但有一点扭曲。我有一个类object
属性的类。对于对象可以容纳的每种类型,我必须为类添加KnownType
属性。由于班级不知道对象将包含什么,我无法即时填充KnownType
。
答案 6 :(得分:0)
我遇到了与OP完全相同的症状,但是我的目标是无法控制的Oracle Web服务。在独立的测试Web应用程序中,WebService调用可以正常运行,但在需要实现的.NET应用程序中,WebService调用不能正常运行。
我不明白为什么,但是将web.config中的ItemsControl
从4.5更新为4.6.1解决了我的应用程序的问题。
targetFramework
<httpRuntime targetFramework="4.5" requestValidationMode="4.5" executionTimeout="36000" />