服务 class 何时初始化?
When is service class initialized?
如果我使用 visual studio 创建了服务引用,并且生成了以下客户端:
public partial class MyServiceClient : System.ServiceModel.ClientBase<MyType>
问题是:serviceclass什么时候初始化? (什么时候调用 "new MyService()")
当我这样做时:
MyServiceClient client = new MyServiceClient();
或者可能只在这里:
client.DoStuff()
?
(我问的原因是因为我想知道服务对象在被垃圾收集之前还存活了多长时间)
这取决于我认为的绑定。对于公共绑定(SOAP 和 NetTcp),客户端在第一次调用之前根本不使用网络。这意味着在此之前未实例化服务器对象,因为未通知服务器。
通常最好使用 PerCall
实例化并且服务对象非常便宜。这样你就根本不需要考虑这个问题,甚至不需要这个问题的答案。
服务器端实例化行为由您在 ServiceContract
.
中指定的 InstanceContextMode
枚举控制
每个选项的行为如下:
- PerCall - 为服务调用的生命周期创建实例。调用完成后回收。
- PerSession - 为与客户端的会话的生命周期创建实例。会话关闭(或出现故障)后回收。
- 单一 - 实例在第一次调用 ServiceHost 构造函数时创建,并在服务的生命周期内维护。
有一些额外的选项可用于更改通过 MSDN : ServiceBehaviorAttribute
上的属性公开的服务器实例发布行为
编辑:
ServiceHost
构造函数在客户端代理 class 上调用 Open()
方法时调用(在本例中为 MyServiceClient
)
如果我使用 visual studio 创建了服务引用,并且生成了以下客户端:
public partial class MyServiceClient : System.ServiceModel.ClientBase<MyType>
问题是:serviceclass什么时候初始化? (什么时候调用 "new MyService()") 当我这样做时:
MyServiceClient client = new MyServiceClient();
或者可能只在这里:
client.DoStuff()
?
(我问的原因是因为我想知道服务对象在被垃圾收集之前还存活了多长时间)
这取决于我认为的绑定。对于公共绑定(SOAP 和 NetTcp),客户端在第一次调用之前根本不使用网络。这意味着在此之前未实例化服务器对象,因为未通知服务器。
通常最好使用 PerCall
实例化并且服务对象非常便宜。这样你就根本不需要考虑这个问题,甚至不需要这个问题的答案。
服务器端实例化行为由您在 ServiceContract
.
InstanceContextMode
枚举控制
每个选项的行为如下:
- PerCall - 为服务调用的生命周期创建实例。调用完成后回收。
- PerSession - 为与客户端的会话的生命周期创建实例。会话关闭(或出现故障)后回收。
- 单一 - 实例在第一次调用 ServiceHost 构造函数时创建,并在服务的生命周期内维护。
有一些额外的选项可用于更改通过 MSDN : ServiceBehaviorAttribute
上的属性公开的服务器实例发布行为编辑:
ServiceHost
构造函数在客户端代理 class 上调用 Open()
方法时调用(在本例中为 MyServiceClient
)