создание экземпляра объекта из веб-службы по сравнению с созданием экземпляра объекта из обычного класса

У меня есть очень простой веб-сервис:

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";
        }

    }
}

когда я запускаю этот проект, в моем браузере открывается сервис: введите здесь описание изображения


в другом решении: (консольное приложение)

Я могу подключиться к этой службе, добавив ссылку:

введите здесь описание изображения

введите здесь описание изображения

затем нажмите кнопку добавления веб-ссылки: введите здесь описание изображения

Наконец, я ввожу URL только что созданного сервиса: введите здесь описание изображения

Теперь я могу создать экземпляр объекта класса 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();


        }
    }
}

почему myInt не увеличивается каждый раз, когда я вызываю метод увеличения счетчика? каждый раз, когда я вызываю этот метод, он возвращает 1.


person Tono Nam    schedule 28.09.2011    source источник
comment
+1 за подробное объяснение проблемы.   -  person Amy B    schedule 29.09.2011


Ответы (3)


Службы, созданные с помощью старой технологии .asmx, не являются одноэлементными экземплярами. Это означает, что каждый вызов, который вы делаете на сервер, каждый раз создает новый экземпляр службы. Два реальных решения: либо использовать статические переменные (эээ....), либо переключиться на использование WCF.

person Matthew Abbott    schedule 28.09.2011
comment
поэтому, если я хочу, чтобы каждый клиент отображал разные результаты в зависимости от того, сколько раз он вызывал метод увеличения счетчика, который будет возможен с WCF? - person Tono Nam; 29.09.2011

Потому что на стороне сервера класс создается и удаляется с КАЖДЫМ вызовом, который вы делаете от клиента... ваш клиент является просто "прокси" и не соответствует непосредственно экземпляру на стороне сервера...

Вы можете либо сделать myInt static, либо сделать класс обслуживания на стороне сервера Singleton... оба варианта будут означать, что myInt является общим для ВСЕХ клиентов... или вы можете реализовать некоторое управление сеансом для достижения специфичного для клиента myInt... использование WCF на стороне сервера кажется ИМХО лучшим решением - оно поставляется с настраиваемыми параметрами для синглтона, управления сеансами и т. д.

ИЗМЕНИТЬ — согласно комментариям:

С WCF вы можете иметь .NET-клиенты с управлением сеансом, что, в свою очередь, позволяет вам иметь разные (зависящие от клиента) значения для myInt...

person Yahia    schedule 28.09.2011

Экземпляр веб-сервиса уничтожается в конце каждого вызова метода, поэтому вы всегда получаете один и тот же результат. Вам нужен какой-то способ сохранить это значение.

person Arief    schedule 28.09.2011