从Web服务实例化对象与从常规类实例化对象

时间:2011-09-28 20:37:49

标签: c# asp.net webrequest

我有一个非常基本的网络服务:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;

namespace WebService1
{        
    /// <summary>
    /// Summary description for Service1
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class Service1 : System.Web.Services.WebService
    {

        public int myInt = 0;

        [WebMethod]
        public int increaseCounter()
        {
            myInt++;
            return myInt;
        }

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

    }
}

当我运行该项目时,我的浏览器会打开,向我展示服务: enter image description here


在另一个解决方案上:(控制台应用程序)

我可以通过添加引用来连接到该服务:

enter image description here

enter image description here

然后点击添加网络参考按钮: enter image description here

最后,我输入刚刚创建的服务的url: enter image description here

现在我能够从我的控制台应用程序中将类Service1实例化为:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication36
{
    class Program
    {
        static void Main(string[] args)
        {
            localhost.Service1 service = new localhost.Service1();

            // here is the part I don't understand..
            // from a regular class you will expect myInt to increase every time you call
            // the increseCounter method. Even if I call it twice I always get the same result.

            int i;
            i=service.increaseCounter();
            i=service.increaseCounter();


            Console.WriteLine(service.increaseCounter().ToString());
            Console.Read();


        }
    }
}

为什么每次调用increaseCounter方法时myInt都不会增加?每当我调用该方法时,它返回1.

3 个答案:

答案 0 :(得分:4)

通过较旧的 .asmx 技术创建的服务不是单例实例。这意味着您对服务器的每次调用每次都会实例化一个新的服务实例。两个真正的解决方案,要么使用静态变量(eugh ....),要么切换到使用WCF。

答案 1 :(得分:1)

在服务器端,通过客户端的每次调用创建和处理类...您的客户端只是一个“代理”,并不直接对应于服务器端的实例... < / p>

您可以制作myInt static或将服务器端服务类设为Singleton ......这两个选项都意味着myInt在所有客户端共享......或者您可以实现一些会话管理来实现客户端特定的myInt ... 使用WCF服务器端似乎是恕我直言最好的解决方案 - 它带有单例,会话管理等的可配置选项。 < / p>

编辑 - 根据评论:

使用WCF,您可以使用具有会话管理功能的.NET客户端,从而允许您为myInt提供不同的(特定于客户端)值...

答案 2 :(得分:0)

webservice实例在每个方法调用结束时被销毁,这就是为什么你总是得到相同的结果。你需要一些方法来坚持这个价值。