我如何使用两种方法执行 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.
- 我想要一种方法,而不是将 "jobs" 发送到服务器。我正在尝试模拟这种作业,只要 运行 进程等待 20-30 秒,线程休眠并将一行插入数据库中的 JOBS table。
- 我想要另一种方法,每 5 秒使用客户端回发轮询一次数据库,以从 JOBS table(已完成,当前 运行)
中获取作业列表
这是我目前得到的结果,两种方法都有效,除了当一个长 运行 作业正在休眠时,客户端无法检索作业列表另一个电话。我已经在 "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 时,一切正常。
场景是这样的:
我在 WCF 中做一个 Web 服务,在 ASP.NET 中做一个客户端应用程序。语言是 VB.NET.
- 我想要一种方法,而不是将 "jobs" 发送到服务器。我正在尝试模拟这种作业,只要 运行 进程等待 20-30 秒,线程休眠并将一行插入数据库中的 JOBS table。
- 我想要另一种方法,每 5 秒使用客户端回发轮询一次数据库,以从 JOBS table(已完成,当前 运行) 中获取作业列表
这是我目前得到的结果,两种方法都有效,除了当一个长 运行 作业正在休眠时,客户端无法检索作业列表另一个电话。我已经在 "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 时,一切正常。