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

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

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();


        }
    }
}

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

Ответы [ 3 ]

4 голосов
/ 29 сентября 2011

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

1 голос
/ 29 сентября 2011

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

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

РЕДАКТИРОВАТЬ - согласно комментариям:

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

0 голосов
/ 29 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...