【问题标题】:WCF service queriesWCF 服务查询
【发布时间】:2009-10-24 08:19:04
【问题描述】:

我有一个 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 服务。

在客户端应用程序中,我动态创建了一个服务客户端,如下所示:

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 与否.. 我是通过 Ping 命令来做的.. 最好的方法是什么!

【问题讨论】:

  • 考虑创建第二个关于检查 url 是否有效的问题。我不认为 ping 命令是个好主意,因为它只测试主机地址并测试 icmp 协议,而不是 tcp。主机可能不响应 ping 但这并不意味着它不是有效的 url。

标签: c# asp.net wcf


【解决方案1】:

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

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

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

是的,当然 - 这意味着您应该让您的服务类保持简单和精简,并且不要进行大量的初始化/状态管理。无论如何,任何需要在服务调用之间持久化的东西都应该放在持久化存储中,比如数据库。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多