動作中の WCF Web サービスを継承しましたが、大きな欠陥が 1 つあります。WCF サービスはメモリを消費し、サービスを再起動しない限り解放しません。Web サービスにリクエストが届いて半日が経過した後、サービスをホストしているサーバーのメモリは 2 ギガ近くまで上昇し、水の中で死んでしまいます。
Web サービスが応答を受け取った後にメモリを解放できるようにしたいのですが、その方法がわかりません (WCF はまだ私にとって初めてです)。これが私が持っているものです。
- このようなサービス コントラクトを持つ dll。
<ServiceContract(Name:="CheckOut", Namespace:="http://localhost:8000/MyService/CheckOut")> _
Public Interface ICheckOut
<OperationContract()> _
Function SubmitOrder(ByVal XMLForSubmitOrder As String) As String
End Function
コントラクトを Web サービスに公開するサービス参照を作成します。
これは私の Web サービス メソッドです。
Private mMyClient As MyClient
...
<WebMethod()> _
<SoapHeader("MyCredentials")> _
Public Function SubmitOrder(ByVal InputXML As String) As String
If (MyCredentails IsNot Nothing) Then
SetMyCredential()
sReturn = mMyClient.SubmitOrder(InputXML)
mMyClient.Close()
mMyClient = Nothing
Return sReturn
End If
Return "Invalid recipient credentials"
End Function
残念ながら、Close と Set to Nothing はサービスのメモリ消費に影響を与えません。
私のサービスexeは次のようになります。
Imports MyDll.WCFWrapper
Public Class WCFService
Private mMyServiceHost As ServiceModel.ServiceHost
Protected Overrides Sub OnStart(ByVal args() As String)
mMyServiceHost = New ServiceModel.ServiceHost(GetType(MyService))
mMyServiceHost.Open()
End Sub
Protected Overrides Sub OnStop()
If Not IsNothing(mMyServiceHost) Then
mMyServiceHost.Close()
End If
End Sub
End Class
これらのメソッドは、Service Manager によって開始されます。戻った後、Web サービス メソッドから何かを呼び出して、WCF サービスを "破棄" できるようにしたいと考えています。これが最善の方法かどうかはわかりませんが、WCF サービスのメモリ使用量をどのように管理すればよいか途方に暮れています。