Вызовы клиента службы WFC Создание экземпляров и параллелизм

Заранее спасибо за помощь. Я прочитал несколько статей о параллелизме, создании экземпляров и безопасности потоков, но, признаюсь, у меня все еще есть сомнения. На самом деле информация в статьях иногда противоречива.

У меня есть простая служба WFC, которая получает период даты (StartDate и EndDate). Служба должна искать файлы, содержащие дату в своем имени, в пределах периода, определенного StartDate и EndDate. Затем найденные файлы будут заархивированы и загружены на сервер.

После многих тестов я никогда не замечал никаких проблем с работой сервиса. Но прежде чем использовать службу в производственной среде, мне нужно убедиться, что код службы безопасен, чтобы гарантировать, что несколько одновременных запросов от клиентов не повлияют на целостность данных других запросов.

Я разместил фрагмент кода и добавил комментарии/вопросы к коду.

Обратите внимание, что я установил экземпляр службы на PerCall. Как я заметил в документации Microsoft, «при создании экземпляров PerCall параллелизм не имеет значения, поскольку каждое сообщение обрабатывается новым экземпляром службы». Но каждый экземпляр службы сам по себе является потокобезопасным? Другими словами, каждый вызов клиента в сервис не может изменить данные других вызовов?

Король С уважением. Дж. Кампос

      ' - - - - - - - - - - - - - - -  WFC Service  Contract - - - - - - - - - - - - - - - 
<ServiceContract()>
Public Interface IMyReports
    <OperationContract(IsOneWay:=True)>
    Sub SvcRequest(ByVal ClientID as integer, ByVal startDate as string, ByVal EndDate)
End Interface

' - - - - - - - - - - - - - - -  WFC Service - - - - - - - - - - - - - - - 

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.PerCall)>
Public Class SvcDoRequest
    Implements IMyReports

    '??? These Private members can be changed by another Service Call?
    Private Dat1 as string=""
    Private Dat2 as string=""
    Private SearchFolder as string=""

    Public Sub SvcRequest(StartDate as string, EndDate as String) Implements IMyReports.SvcRequest
        SearchFolder= "c:\SearchFolder\" 
        Dat1 as string=StarDate 
        Dat2 as string=EndDate  
      
        Dim ListOfFiles as new List(of String)  
      
       'Recursive File Search 
       '??? Arguments passed byRef. Can the Arguments be Changed by another Service Call?
      
        Call FGetFiles(SearchFolder, ListOfFiles)
        
        Dim Result as integer=0  
        If ListOfFiles.Count>0  
            Dim ZipFileName as string="c:\MyZipFile.Zip" 
            Dim ErrMsg as string=""

            ' External Library to Create a ZIP File containing ListOfFiles()
            '??? ErrMsg is passed byRef in order to return a possible error message. 
            '??? Can ErrMsg be Changed by another Service Call?

            Dim ClZip As New  MyZipLibrary.ZipClass
            If ClZip.FCreateZip(ListOfFiles, ZipFileName, ErrMsg)=False Then
               Call WriteToLog(ErrMsg)
           Result=-1
        Else
           Result=1             
        End if
    End if
     
    ' Upload ZipFile 
    '           
    End Sub

    Private Function FGetFiles(ByRef Folder As String, ByRef LFiles As List(Of String)) as boolean 
    
        '??? is this recursive function safe? Byref args Folder,LFiles can be changed by another Call?

        For Each File1 As String In Directory.GetFiles(Folder)
            Dim FileInfo1 As New FileInfo(File1)
            Dim FileDate  As String = FileInfo1.Name.Substring(0,8)       
             If FileDate >= Dat1 And FileDate <= Dat2 Then
                 LFiles.Add(FileInfo1.FullName)
            End If
        Next
        For Each Dir1 As String In Directory.GetDirectories(Folder)
            Call FGetFiles(Dir1, LFiles)
        Next
        Return True
    End Function
End Class

'- - - - - - - - - - - - - - - - - - - - - - - - -  ZIP Library - - - - - - - - - - - 
Public Class MyZipLibrary
    Public Function FCreateZip(byval ListOfFiles as List(of String), 
                               Byval ZipFileName as string, ByRef ErrMsg as string) as Boolean    
        If Not CreateZipFile()
            'Byref Argument ErrMsg. can be changed by another client Call?                         
            ErrMsg="Unable To Create ZipFile"
            Return false
        Else
            Return True
        End if
    End function
End Class

0 ответов

Другие вопросы по тегам