2010-12-13 79 views
0

這應該是相當基本的,但是說我在我的WCF服務上有一個公共屬性作爲局部變量,並且我在一次調用該服務時設置了它。有沒有辦法保存這些數據,以便再次調用服務? (如果沒有寫入數據到XML或DB,並重新對其進行引用或類似的東西)在wcf調用之間保留對象?

執行從Winform的來電:

Public Class ClientSideWinForm 

    Private proxy As ServiceReference.Client 

    Private Sub Client_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     proxy = New ServiceReference.Client 
    End Sub 

    Private Sub btnStartTests_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartTests.Click 
     addToTxtResults("Try Chk Program Valid...") 
     Try 
      addToTxtResults(proxy.RequestChkValidProgram("Some-serial-number")) 'returns true or false and instanciates the object server side 

      addToTxtResults(proxy.RequestFirstName()) ' returns nothing 
     Catch ex As Exception 
      addToTxtResults(ex.ToString) 
     End Try 
    End Sub 
End Class 

服務本身(簡單化了一點,但behaivor仍然存在):

Public Class Service 
    Implements IService 

Public Property X As String 

Function RequestChkValidProgram(ByVal strSerialNumber As String) As Integer Implements IService.RequestChkValidProgram 
     X = "hello" 
End Function 

Function RequestFirstName() As String Implements IService.RequestFirstName 
    Return X 
End Function 

End Class 
+0

看起來像是如果我將InstanceContextMode更改爲單個信息在調用之間持續存在。謝謝大家。 如果有人想詳細說明爲什麼這可能是一個壞主意,我真的很想知道。再次,謝謝! StackOverflow是相當驚人的。一般來說,應避免在Web服務中使用狀態 – Kosko 2010-12-13 20:44:16

+0

。您現在還需要互鎖訪問您的狀態,以便兩個呼叫不會相互覆蓋。 – 2010-12-14 01:21:05

+0

@John Saunders:你有任何一個鏈接可以進一步描述如何互鎖訪問嗎?它是通過用lock(this)包裝代碼來完成的{doStuff(); },使用System.Threading.Interlock.Increment(counter);爲計數器,並在覆蓋它們之前比較值? – Kosko 2010-12-14 13:31:45

回答

1

如果我正確地理解了這個問題,那麼服務調用之間的服務實現狀態就會丟失。您應該考慮設置您的服務實現的InstanceContextMode ServiceBehavior--聽起來它現在設置爲PerCall,這樣每個服務調用都會獲得它自己的實例。 PerSessionSingle可能是更好的選擇。

雖然我不一定同意@John Saunders這是一個糟糕的主意,但有關您想要完成的更多細節將會很有用。 :)

+0

我已經添加了一些小小的代碼來澄清我在這裏要做的事情。它看起來好像你有正確的解釋。謝謝! – Kosko 2010-12-13 20:28:00

+0

@Kosko感謝您的闡述,但我們可能需要看看服務端實現(即包含不存在於調用之間的屬性)以瞭解可能出錯的想法。乾杯。 – 2010-12-13 20:29:47

1

只要你有你的服務的一個實例,那麼你可以從一個調用到下保存數據。你應該考慮告訴我們爲什麼你要這樣做,因爲這聽起來像個壞主意。

+0

感謝您的快速回復。它是服務的單個實例,但在第二次調用時,該屬性會重新設置爲「Nothing」。至於推理,第一個調用是檢查客戶端的屬性是否有效(例如序列號),並讓服務知道它正在使用哪個客戶端。接下來的電話將是檢索有關該客戶的信息,如名稱,電話等基本信息) 我可以每次都傳遞序列號,但我認爲只需要通過一次就可以了,並根據需要獲取其他信息。 – Kosko 2010-12-13 20:17:40

+2

你怎麼知道這是一個單一的實例?小心顯示一些代碼? – 2010-12-13 20:18:44

+0

同意。這聽起來不對,你們都。 :) – 2010-12-13 20:19:56