Запросы службы WCF - PullRequest
       19

Запросы службы WCF

0 голосов
/ 24 октября 2009

У меня есть служба 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. Этот веб-сервис можно развернуть в нескольких местах, чтобы пользователь мог подключиться к любому веб-сервису, выбрав URL-адрес в поле со списком.

В клиентском приложении я динамически создаю клиент службы, как показано ниже:

ServiceReference1.DXMyServiceClient _client = null;

_client = new DXMyServiceClient ();

_client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);

Вопросы Во время отладки я замечаю всякий раз, когда вызываю какие-либо методы веб-службы, каждый раз, когда вызывается конструктор MyService (если я подключен к той же службе).

как например, когда я делаю:

_client.Read();//MyService () constructor is called 

_client.Write();//MyService () constructor is called 

Проблема в том, что мне нужно снова выполнить всю инициализацию .. например, если я подключаюсь к базе данных, тогда мне нужно снова построить строку подключения и все прочее ..

Это естественное поведение или я делаю что-то не так?

Во-вторых, Я хочу подтвердить пользователя для действительного URL (веб-службы). Если он подключается к действительному URL или нет .. Я делаю это с помощью команды Ping .. Каков наилучший подход для этого !!

Ответы [ 3 ]

1 голос
/ 24 октября 2009

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

Да, это поведение по умолчанию и рекомендуемое поведение. Вы должны НЕ полагаться на любое состояние на вашей стороне обслуживания! Как правило, это не очень хорошая идея и может привести к множеству проблем.

В рекомендованном для каждого вызова режиме службы WCF запущен экземпляр класса ServiceHost (), который будет прослушивать входящие запросы / сообщения. Каждый раз, когда поступает запрос, создается новый, свежий экземпляр класса обслуживания (который реализует ваш контракт на обслуживание) для обработки запроса - так же, как каждый раз, когда вы нажимаете URL-адрес в ASP.NET, создается экземпляр класса вашей страницы для обработки запрос.

Да, конечно - это означает, что вы должны сохранять свои классы обслуживания простыми и экономными, а не выполнять большую часть инициализации / управления состоянием. Все, что необходимо сохранить между вызовами службы, должно быть помещено в постоянное хранилище, например, в базу данных.

0 голосов
/ 24 октября 2009

Проблема в том, что я должен сделать все инициализация снова .. как если бы я подключение к базе данных, то у меня есть снова построить строку подключения и все прочее ..

Это естественное поведение или я что-то не так делаешь?

По умолчанию для InstanceContextMode установлено значение PerSession, а для параметра ConcurrencyMode установлено значение Single. Однако, если вы не используете сеанс, в основном каждый раз, когда вы вызываете сервис, создается новый экземпляр. Это желаемое поведение, потому что оно считается более масштабируемым. Если это проблема для вас, вы должны установить сеанс между последующими вызовами, тогда для каждого сеанса вы получите один экземпляр вашего сервиса.

Вот руководство, как это сделать: Использование сессий .

0 голосов
/ 24 октября 2009

Вы должны взглянуть на класс ServiceBehaviorAttribute и его свойство InstanceContextMode. Он контролирует срок службы вашего объекта обслуживания.

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