我有一个将数据返回到桌面应用程序的网络服务。我遇到的问题是,当网络服务返回少量数据时,一切正常,但当数据量很大时,它会抛出以下异常:
System.Net.WebException:底层连接已关闭:接收时发生意外错误。
当我调试 Web 服务时,我发现这个特定方法被调用了两次。它第一次执行 return 语句时没有任何反应,但是当它第二次执行时,桌面应用程序中会抛出上述异常。
我之前在 stackoverflow 上发现过类似的帖子,但它们没有解决我的问题。有人能告诉我这里发生了什么事吗?
谢谢!
这可能是因为消息的大小大于默认的消息大小。您可以尝试在端点配置中增加 this 值。您也可以看看这篇文章。
更新:
为了进一步诊断问题,我建议您通过将以下内容放入配置文件中来激活服务上的跟踪:
<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 打开该文件,该文件将为您提供有关调用和错误消息的大量信息。
我最近遇到了这个问题。
事实证明,分析由 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; }
}
}
我也遇到这个问题了。对我来说,发生这种情况是因为我有一个
[DataMember]
属性,其中有 get{}
但没有 set{}
。添加 set{}
后,此行为停止。
我也遇到了同样的问题。事实证明,WCF 无法以 JSON 形式返回
DateTime
,所以我必须将其设为 Nullable<DateTime>
。
我最近遇到了这个问题,结果我忘记用[DataContract]标记其中一个数据传输类
我也遇到了这个问题,我的解决方案与 Batgar 的类似,但有所不同。我有一个类具有
object
类型的属性。我必须为对象可以容纳的每种类型添加 KnownType
属性到类中。我无法即时填充 KnownType
,因为类不知道该对象将包含什么。
我遇到了与 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" />