WCF服务超时错误?

时间:2015-09-29 15:05:04

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

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

工作流程

excel有500条记录。我正在使用插入查询。我将Excel记录转换为数据集(在C#和VB.Net中),然后我将相同的数据集传递给服务,以便为每个语句插入数据库(让我知道它是否混淆)。在此之后,我试图将插入的记录显示到UI中的gridview(这里出现了问题)。

问题是:

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

套接字连接已中止。这可能是由于处理消息的错误或远程主机超出接收超时或基础网络资源问题引起的。本地套接字超时为00:09:59.9989999 ---> System.Net.Sockets.SocketException:现有连接被远程主机强行关闭....

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

我尝试的是:

我已尝试过以下内容,

  1. 我试图在Service Web配置文件中增加发送超时(如00:20:00),然后我在Client Application中反映了相同的文件但没有任何反应,因为值​​采用默认的Timeout。 (我相信,来自configuration.svcinfo =>在serializedValue中,发送超时是00:10:00)。
  2. 我尝试按照[here]的说法增加maxreceivedMessageSize,maxBufferSize,maxBufferPoolSize。 (http://www.codeproject.com/Questions/633699/Socket-Exception-WCF)。但什么都没发生。
  3. 注意:当我插入一条记录时,它工作正常。

    另一个障碍是,这发生在我的机器上。但如果我在朋友的机器上尝试同样的事情,我能够毫无错误地获得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
    

1 个答案:

答案 0 :(得分:0)

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,则只需删除行

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