WCF服务查询

时间:2009-10-24 08:19:05

标签: c# asp.net wcf

我有一个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命令这样做.. 最好的方法是什么!!

3 个答案:

答案 0 :(得分:1)

  
    

问题在调试时,每当我调用任何方法时都会注意到     每次调用MyService的构造函数时的Web服务     (如果我连接到同一服务)。     问题是我必须再次进行所有初始化..     就像我连接到数据库然后我必须再次     建立连接字符串和所有东西..

  

是的,这是默认行为和推荐行为。您应该依赖服务方面的任何州!这通常不是一个好主意,可能会导致许多问题。

在推荐的“每次调用”模式下,WCF服务运行ServiceHost()类实例,该实例将侦听传入的请求/消息。每次请求进入时,都会构造一个新的服务类实例(实现服务契约)来处理请求 - 就像每次在ASP.NET中访问URL一样,您的页面类被实例化以处理请求。

是的,当然 - 这意味着你应该保持你的服务类简单和精简,做很多初始化/状态管理。无论如何,任何需要在服务调用之间持久化的东西都应该放在持久性存储中,比如数据库。

答案 1 :(得分:0)

您应该查看ServiceBehaviorAttribute类及其InstanceContextMode属性。它控制服务对象的生命周期。

答案 2 :(得分:0)

  

问题是我必须做所有的事情   再次初始化..就像我   然后我连接到数据库   再次构建连接字符串   和所有的东西..

     

这是自然行为还是我   做错了什么?

默认情况下,InstanceContextMode设置为PerSession,ConcurrencyMode设置为Single。但是,如果不使用会话,基本上每次调用服务时都会创建新实例。这是期望的行为,因为它被认为更具可扩展性。如果这对您来说是个问题,您应该在后续调用之间实现会话,然后对于每个会话,您将获得一个服务实例。

以下是如何执行此操作的指南:Using Sessions