如何在每次Web服务调用后拆除wcf服务

时间:2012-05-05 00:46:36

标签: vb.net wcf

我继承了一个有一个主要缺陷的工作WCF Web服务 - WCF服务消耗内存,除非服务重新启动,否则不会释放。在半天的请求到达Web服务之后,托管该服务的服务器上的内存攀升至接近2演出并且已经死在水中。

我希望能够在Web服务收到响应后释放内存,但无法弄清楚如何(WCF对我来说还是新手)。这就是我所拥有的。

  1. 有这样服务合同的dll。
  2.     <ServiceContract(Name:="CheckOut", Namespace:="http://localhost:8000/MyService/CheckOut")> _
        Public Interface ICheckOut
           <OperationContract()> _
           Function SubmitOrder(ByVal XMLForSubmitOrder As String) As String
           End Function
    

    我构建了一个服务引用,以便将合同公开给我的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
    

    这些方法由服务管理器触发。我希望能够从我的Web服务方法中调用一些东西,以便在我返回后“拆除”WCF服务。我不确定这是否是最好的方法,但我不知道如何管理WCF服务的内存使用情况。

2 个答案:

答案 0 :(得分:1)

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

  

每次通话服务

     

每次呼叫服务是Windows Communication Foundation的默认设置   实例化模式。为每次呼叫配置服务类型时   激活,服务实例,公共语言运行时(CLR)   对象,仅在客户端调用正在进行时存在。每个客户   请求获取一个新的专用服务实例。图2说明了   这个单呼叫激活如何工作。

您是否正确处置了您维护的任何资源?也许任何需要关闭的数据库连接或流?很难从您的代码中了解,因为您尚未讨论SubmitOrderMyClient的影响。罪魁祸首完全有可能在其中。

答案 1 :(得分:0)

在本文中: http://wcftutorial.net/WCF-Instance-Deactivation.aspx

解释显式停用..