我有一个WCF服务,方法如下所示:
public interface IService
{
[OperationContract]
bool Read();
[OperationContract]
bool Write();
}
public class MyService : IService
{
//Constructor
MyService()
{
//Initialization
}
public bool Read()
{
//Definition
}
public bool Write()
{
//Definition
}
}
我有一个基于桌面的应用程序,它通过URL使用Web服务。 此Web服务可以部署在多个位置,因此用户可以通过从组合框中选择URL来连接到任何Web服务。
在客户端应用程序中,我动态创建一个Service客户端,如下所示:
ServiceReference1.DXMyServiceClient _client = null;
_client = new DXMyServiceClient ();
_client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
问题 每当我调用MyService的构造函数(如果我连接到同一个服务)时,每当我调用任何Web服务方法时,我都会注意到调试。
例如当我这样做时:
_client.Read();//MyService () constructor is called
_client.Write();//MyService () constructor is called
问题是我必须再次进行所有初始化..就像我连接到数据库然后我必须再次构建连接字符串和所有东西..
这是自然行为还是我做错了什么?
其次, 我想验证用户的有效URL(Web服务)。如果它是否连接到有效的URL ...我通过Ping命令这样做.. 最好的方法是什么!!
答案 0 :(得分:1)
问题在调试时,每当我调用任何方法时都会注意到 每次调用MyService的构造函数时的Web服务 (如果我连接到同一服务)。 问题是我必须再次进行所有初始化.. 就像我连接到数据库然后我必须再次 建立连接字符串和所有东西..
是的,这是默认行为和推荐行为。您应该不依赖服务方面的任何州!这通常不是一个好主意,可能会导致许多问题。
在推荐的“每次调用”模式下,WCF服务运行ServiceHost()类实例,该实例将侦听传入的请求/消息。每次请求进入时,都会构造一个新的服务类实例(实现服务契约)来处理请求 - 就像每次在ASP.NET中访问URL一样,您的页面类被实例化以处理请求。
是的,当然 - 这意味着你应该保持你的服务类简单和精简,不做很多初始化/状态管理。无论如何,任何需要在服务调用之间持久化的东西都应该放在持久性存储中,比如数据库。
答案 1 :(得分:0)
您应该查看ServiceBehaviorAttribute类及其InstanceContextMode
属性。它控制服务对象的生命周期。
答案 2 :(得分:0)
问题是我必须做所有的事情 再次初始化..就像我 然后我连接到数据库 再次构建连接字符串 和所有的东西..
这是自然行为还是我 做错了什么?
默认情况下,InstanceContextMode设置为PerSession,ConcurrencyMode设置为Single。但是,如果不使用会话,基本上每次调用服务时都会创建新实例。这是期望的行为,因为它被认为更具可扩展性。如果这对您来说是个问题,您应该在后续调用之间实现会话,然后对于每个会话,您将获得一个服务实例。
以下是如何执行此操作的指南:Using Sessions。