0

我继承了一个工作中的 WCF Web 服务,但存在一个主要缺陷 - WCF 服务会消耗内存并且不会释放,除非重新启动服务。经过半天的请求访问 Web 服务后,托管服务的服务器上的内存攀升至接近 2 gig 并且死在水中。

我希望能够在 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 服务。

这是我的网络服务方法。

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 服务的内存使用情况。

4

1 回答 1

1

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

每次通话服务

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

您是否妥善处理了您维护的任何资源?也许任何需要关闭的数据库连接或流?很难从您的代码中分辨出来,因为您还没有讨论过SubmitOrderfor 的作用MyClient。罪魁祸首完全有可能在里面。

于 2012-05-05T01:37:34.673 回答