我如何使用两种方法执行 WCF 服务:一种方法等待并将数据插入数据库,另一种方法轮询数据库?

How I do a WCF service with two methods: one that waits and insert data into the DB and another to poll the DB?

场景是这样的:

我在 WCF 中做一个 Web 服务,在 ASP.NET 中做一个客户端应用程序。语言是 VB.NET.

这是我目前得到的结果,两种方法都有效,除了当一个长 运行 作业正在休眠时,客户端无法检索作业列表另一个电话。我已经在 "PerCall" 中尝试过,但没有成功。我怀疑线程在某种程度上锁定了服务,或者我可能必须使用异步调用。我在 web.config 使用 HttpBasicBinding ...我有点迷路,我没有找到任何代码做类似的事情。

这是服务端的代码:

iServiceJobs.vb

   <ServiceContract()>
    Public Interface IServiceJobs

    <OperationContract(IsOneWay:=True)>
    Sub SendJob(ByVal runTime As Integer, ByVal id As String)

    <OperationContract>
    Function GetJobsList() As List(Of ClassJob)

ServiceJobs.vb

Public Class ServiceJobs Implements IServiceJobs

    Public SendJob(ByVal runTime As Integer, ByVal id As String) Implements IServiceJobs.SendJob
        Dim connStr As String = "..."
        Dim conn As New OracleConnection(connStr)
        conn.Open()
        Dim query As String = "INSERT INTO JOBS(...)"
        Dim cmd As New OracleCommand(query, conn)
        cmd.ExecuteNonQuery()
        Threading.Thread.Sleep(runTime* 1000)
        cmd = New OracleCommand(query, conn)
        cmd.ExecuteNonQuery()
    End Sub

    Public Function GetJobList() As List(Of ClassJob) Implements IServiceJobs.GetJobsList
        Try
            Dim jobList As New List(Of ClassJobs)
            Dim connStr As String = "..."
            Dim conn As New OracleConnection(connStr)
            conn.Open()
            Dim query As String = "SELECT * FROM JOBS"
            Dim cmd As New OracleCommand(query, conn)
            Dim dr As OracleDataReader
            Dim job As ClassJob
            dr = cmd.ExecuteReader
            While dr.Read
                job = New ClassJob
                job.id = dr(0)
                job.lock = dr(3)
                ...
                jobList.Add(job)
                job = Nothing
            End While
            Return jobList
        Catch ex As Exception
            Return Nothing
        End Try
    End Function

End Class

客户端中的代码非常简单,只有两个按钮,一个用于插入作业的 ws 调用,另一个用于获取作业列表。

我乐于接受任何有关如何更好地实施此方案的建议。

编辑: 我试过了

<ServiceBehavior(ConcurrencyMode:=ConcurrencyMode.Multiple, InstanceContextMode:=InstanceContextMode.PerCall)>

但它不起作用,GetJobList() returns SendJob() 在此线程上工作时没有任何反应。

已解决:显然,我使用的是过时版本的 Oracle 库。当我从 NuGet 使用 Oracle.ManagedDataAccess 时,一切正常。

已解决:显然,我使用的是过时版本的 Oracle 库。当我从 NuGet 使用 Oracle.ManagedDataAccess 时,一切正常。