0

動作中の WCF Web サービスを継承しましたが、大きな欠陥が 1 つあります。WCF サービスはメモリを消費し、サービスを再起動しない限り解放しません。Web サービスにリクエストが届いて半日が経過した後、サービスをホストしているサーバーのメモリは 2 ギガ近くまで上昇し、水の中で死んでしまいます。

Web サービスが応答を受け取った後にメモリを解放できるようにしたいのですが、その方法がわかりません (WCF はまだ私にとって初めてです)。これが私が持っているものです。

  1. このようなサービス コントラクトを持つ 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 サービスのメモリ使用量をどのように管理すればよいか途方に暮れています。

4

1 に答える 1

1

http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

通話ごとのサービス

呼び出しごとのサービスは、Windows Communication Foundation の既定のインスタンス化モードです。サービスの種類が呼び出しごとのアクティブ化用に構成されている場合、サービス インスタンス (共通言語ランタイム (CLR) オブジェクト) は、クライアント呼び出しの進行中にのみ存在します。すべてのクライアント リクエストは、新しい専用サービス インスタンスを取得します。図 2 は、このシングル コール アクティベーションがどのように機能するかを示しています。

維持しているリソースを適切に処分していますか? おそらく、閉じる必要があるデータベース接続またはストリームはありますか? SubmitOrderの機能について説明していないため、コードから判断するのは困難ですMyClient。犯人が内部にいる可能性は十分にあります。

于 2012-05-05T01:37:34.673 に答える