【问题标题】:I am getting this error in wcf我在 wcf 中收到此错误
【发布时间】:2016-04-27 16:22:17
【问题描述】:

当我从服务器到客户端检索超过 200 000 条记录时,我收到此错误:

底层连接已关闭: 预期保持活动的连接已被服务器关闭。

这里出了什么问题?

【问题讨论】:

  • 错误似乎很明显 - 您是为每个数据库请求打开一个连接还是让一个连接长时间保持活动并重新使用它?
  • 没有看到你的代码,这对我们来说更像是猜测,但这里有一个想法..如果你正在创建与 using(SqlConnection sqlConn = new SqlConnection)) {} 的任何连接,例如,如果你尝试访问 sqlConn,连接就会被释放对象超出范围并且连接不是全局的,它将被关闭等。尝试向我们展示实际问题发生的代码,这意味着您需要设置断点并使用调试器单步执行代码...

标签: c# wcf


【解决方案1】:

很多事情都可能导致 WCF 中出现此问题。最好的解决方法是添加跟踪日志。将以下代码添加到配置文件以激活跟踪:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel"
            switchValue="Information, ActivityTracing"
            propagateActivity="true">
      <listeners>
        <add name="traceListener"
            type="System.Diagnostics.XmlWriterTraceListener"
            initializeData="e:\path_tolog\WebTrace.svclog"  /> <-- Path to the log file 
      </listeners>
    </source>
  </sources>
</system.diagnostics>

【讨论】:

    【解决方案2】:

    正如其他人所说,没有看到任何代码,我们只能猜测,但我在尝试跨 WCF 发送未枚举查询时遇到了类似问题。

    例如,如果您有类似(警告:航空代码!)this..

    var data = ctx.Customers.Where(c => c.CustType == 1);
    

    ...您尝试从 WCF 服务方法返回它,您将得到您提到的异常。这是因为查询已设置完毕,并将其发送到 WCF 进行序列化,但由于序列化尝试在连接关闭后枚举查询而失败。

    答案是在返回之前强制枚举查询。您可以通过将 .ToList() 添加到查询末尾(以及其他方式)来做到这一点。

    正如我所说,没有看到任何代码,这是一个完整的猜测,但我在这些情况下也遇到了同样的异常,所以值得检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-08
      • 2020-05-02
      • 2017-07-16
      • 1970-01-01
      • 2013-07-31
      • 2018-12-23
      • 1970-01-01
      • 2015-10-12
      相关资源
      最近更新 更多