我继承了一个工作中的 WCF Web 服务,但存在一个主要缺陷 - WCF 服务会消耗内存并且不会释放,除非重新启动服务。经过半天的请求访问 Web 服务后,托管服务的服务器上的内存攀升至接近 2 gig 并且死在水中。
我希望能够在 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 服务。
这是我的网络服务方法。
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 服务的内存使用情况。