Как сделать службу WCF двумя способами: один ожидает и вставляет данные в БД, а другой - опрашивает БД? - PullRequest
0 голосов
/ 13 марта 2020

Это сценарий:

Я делаю веб-сервис в WCF и клиентское приложение в ASP. NET. Язык VB. NET.

  • Я хочу метод, чем отправлять «задания» на сервер. Я пытаюсь смоделировать этот вид заданий в виде долго выполняющихся процессов, которые ожидают до 20-30 секунд с бездействием потока и вставкой строки в таблицу JOBS в БД.
  • Мне нужен другой метод, который опрашивает база данных каждые 5 секунд с постбеками клиента для получения списков заданий из таблицы JOBS (завершено и в данный момент выполняется)

Это то, что я получил, оба метода работают, кроме если долго выполняющееся задание находится в спящем режиме, клиент не может получить список заданий с помощью другого вызова . Я попробовал "PerCall" в, но это не сработало. Я подозреваю, что поток в некоторой степени блокирует службу или, возможно, мне придется использовать вызовы asyn c. Я использую HttpBasicBinding в web.config ... Я немного растерялся и не нашел ни одного кода, делающего что-то похожее.

Вот код на стороне службы:

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 () ничего не возвращает, пока SendJob () работает с этим потоком.

решено : По-видимому, я использовал устаревшую версию Oracle библиотек. Когда я использовал Oracle .ManagedDataAccess от NuGet, все прошло нормально.

1 Ответ

0 голосов
/ 08 апреля 2020

решено: По-видимому, я использовал устаревшую версию Oracle библиотек. Когда я использовал Oracle .ManagedDataAccess от NuGet, все прошло нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...