【问题标题】:WCF Service Timeout Error?WCF 服务超时错误?
【发布时间】:2015-09-29 15:05:04
【问题描述】:

我有一个场景,比如使用 C# 和 VB 通过 WCF 服务将 excel 导入数据库。我正在使用 WCF Basichttpbinding。

工作流程

excel 有 500 条记录。我在服务中有一个插入查询。我正在将 Excel 记录转换为数据集(在 C# 和 VB.Net 中),然后我将相同的数据集传递给服务,以便使用每个语句插入数据库(如果混淆,请告诉我)。在此之后,我试图将插入的记录显示到 UI 中的 gridview(问题来了)。

问题是:

当我上传 Excel 表格时,我收到如下错误,

套接字连接被中止。这可能是由于处理您的消息时出错或远程主机超出接收超时,或者是潜在的网络资源问题造成的。本地套接字超时为 00:09:59.9989999 --->System.Net.Sockets.SocketException: Existing Connection 被远程主机强行关闭 ....

以上错误显示在客户端应用程序(UI)中。但是数据(来自excel)仍然在幕后插入数据库。

我尝试的是:

我已经尝试过以下事情,

  1. 我尝试在服务 Web 配置文件中增加发送超时(如 00:20:00),然后我在客户端应用程序中反映了相同的文件,但由于值采用默认超时,因此没有任何反应。 (我相信,从 configuration.svcinfo => 在 serializedValue 中,发送超时是 00:10:00)。
  2. 我尝试增加 maxreceivedMessageSize、maxBufferSize、maxBufferPoolSize,如 [此处] 所述。 (http://www.codeproject.com/Questions/633699/Socket-Exception-WCF)。但是什么也没发生。

注意:当我插入一条记录时,它工作得很好。

另一个障碍是,这发生在我的机器上。但是如果我在我朋友的机器上尝试同样的事情,我可以得到 500 条记录而没有任何错误。

用于插入的 WCF 服务代码:

注意:myds 是保存 Excel 工作表中记录的数据集。

If myds.Tables.Count > 0 Then
            If myds.Tables(0).Rows.Count > 0 Then
                  For Each dr In myds.Tables(0).Rows
                       InsertNewLog(userid, gno, pnumber)
                  Next
            End If
End If

Private Sub InsertNewLog(userid As String, gno As Int32, pnumber As String)
   Dim Oraclecon As New OracleConnection(System.Configuration.ConfigurationManager.AppSettings("ConnectionString"))
    Dim transaction As OracleTransaction

    Oraclecon.Open()
    transaction = Oraclecon.BeginTransaction(IsolationLevel.ReadCommitted)

    Dim myCMD As New OracleCommand("insert into Log_table( " & _
         " USER_ID, " & _
         " GROUP_No, " & _
         " PRO_No" ) values (:p_userid,:p_groupno, :p_pronumber)
    myCMD.Connection = Oraclecon

    Dim p_userid As OracleParameter = New OracleParameter()
    p_userid.OracleDbType = OracleDbType.Varchar2
    p_userid.Value = userid
    myCMD.Parameters.Add(p_userid)

    Dim p_groupno As OracleParameter = New OracleParameter()
    p_groupno.OracleDbType = OracleDbType.Int32
    p_groupno.Value = groupnbr
    myCMD.Parameters.Add(p_groupno)

    Dim p_pronumber As OracleParameter = New OracleParameter()
    p_pronumber.OracleDbType = OracleDbType.Varchar2
    p_pronumber.Value = pronumber
    myCMD.Parameters.Add(p_pronumber)
    Try
        myCMD.ExecuteNonQuery()
        transaction.Commit()
    Catch x
        Throw New Exception(x.ToString())
        transaction.Rollback()
        Exit Sub
    Finally
        Oraclecon.Close()
        Oraclecon.Dispose()
    End Try
End Sub

【问题讨论】:

  • 启用有助于查明问题的 WCF 跟踪
  • 客户端是否必须等待日志运行过程完成,或者您可以异步处理它。
  • @3dd 是的,客户端必须等待进程完成。
  • 发布您用于插入数据的代码。很可能你这样做效率低下。没有理由将记录插入 Excel 需要超过 20 分钟。
  • @Ahmedilyas 我没有将数据插入到 Excel 中。我正在将excel数据插入数据库。插入查询很常见,我正在使用它。导入 excel 然后将 excel 转换为数据集(发生在客户端应用程序中)然后我将该数据集传递给具有 Insert 方法的服务(发生在服务端)。

标签: c# asp.net vb.net excel wcf


【解决方案1】:

WCF 配置文件中有几个“超时”选项。我通常将它们全部设置在 .config 文件部分的客户端和服务器端:

<binding name="defaultBinding" 
         closeTimeout="00:01:00" 
         openTimeout="00:01:00" 
         receiveTimeout="00:01:00" 
         sendTimeout="00:01:00">
      <reliableSession enabled="true" inactivityTimeout="00:01:00" />
</binding>

如果您不使用可靠会话,则只需删除行

<reliableSession enabled="true" inactivityTimeout="00:01:00" />

【讨论】:

  • 我正在使用 Basichttpbinding :-( 因为我的客户端应用程序是旧的。不是 wshttpbinding。因此无法使用可靠会话。
  • 如果您不能使用reliableSession - 只需删除此行。 :)
  • 如果我删除那行,它会和我一样。
  • 你确实写了你增加了一个sendTimeOut和maxreceivedMessageSize、maxBufferSize、maxBufferPoolSize。但是你什么也没说receiveTimeout。您是否增加了 receiveTimeout(在客户端和服务器端)?
  • 我也增加了receiveTimeout。但没有结果:-(
猜你喜欢
  • 1970-01-01
  • 2012-03-23
  • 2010-09-18
  • 2013-01-15
  • 1970-01-01
  • 2011-01-14
  • 2010-10-29
相关资源
最近更新 更多