我继承了一个有一个主要缺陷的工作WCF Web服务 - WCF服务消耗内存,除非服务重新启动,否则不会释放。在半天的请求到达Web服务之后,托管该服务的服务器上的内存攀升至接近2演出并且已经死在水中。
我希望能够在Web服务收到响应后释放内存,但无法弄清楚如何(WCF对我来说还是新手)。这就是我所拥有的。
<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服务的内存使用情况。
答案 0 :(得分:1)
http://msdn.microsoft.com/en-us/magazine/cc163590.aspx
每次通话服务
每次呼叫服务是Windows Communication Foundation的默认设置 实例化模式。为每次呼叫配置服务类型时 激活,服务实例,公共语言运行时(CLR) 对象,仅在客户端调用正在进行时存在。每个客户 请求获取一个新的专用服务实例。图2说明了 这个单呼叫激活如何工作。
您是否正确处置了您维护的任何资源?也许任何需要关闭的数据库连接或流?很难从您的代码中了解,因为您尚未讨论SubmitOrder
对MyClient
的影响。罪魁祸首完全有可能在其中。
答案 1 :(得分:0)
在本文中: http://wcftutorial.net/WCF-Instance-Deactivation.aspx
解释显式停用..