WCF: есть ли способ вернуть объект, который может выполняться на сервере? - PullRequest
1 голос
/ 12 марта 2010

Исходя из фона Java, я так думаю:

Сервер предоставляет объект клиенту. Этот объект должен быть в состоянии выполнить на сервере.

Сервер:

private string _S = "A";

public interface IFoo { void Bar(); }

private class Foo : IFoo {
    void Bar() { _S = "B";}
}

public IFoo GetFoo() { return new Foo(); }

Клиент:

IFoo foo = serverChannel.GetFoo();
foo.Bar();

Возможно ли это? Или мое понимание неверно, и это не так, как это работает в WCF? Какой дизайн будет лучше?

Ответы [ 2 ]

3 голосов
/ 12 марта 2010

Нет, я не думаю, что это сработает. Вы видите: WCF не какой-то механизм удаленного вызова, удаленного объекта или вызова удаленной процедуры.

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

Но на самом деле нет никакой связи или удаленной связи между клиентом. Все, что идет между ними, должно быть сериализуемым - в текст XML в его ядре. Вы можете передавать конкретные классы и т. Д., Но вы не можете передавать интерфейс, ссылки на объекты и т. Д.

0 голосов
/ 12 марта 2010

Нет - вы не можете отправлять объекты вокруг. Как отметил marc_s, WCF является коммуникационной средой, ориентированной на сообщения.

Но у вас есть разные варианты создания экземпляров.

По умолчанию Windows Communication Foundation создает экземпляры служб для каждого вызова: экземпляр службы, объект общеязыковой среды выполнения (CLR), существует только во время выполнения вызова клиента. Каждый клиентский запрос получает новый выделенный экземпляр службы. Это что-то вроде Сессионных Бинов без Состояния в J2EE.

Другой вариант - активация на основе сеанса, которая похожа на Stateful Session Beans в J2EE. Используя этот подход, когда клиент создает новый прокси для службы, настроенной как поддерживающая сеанс, WCF активирует новый экземпляр службы и присоединяет его к сеансу. Каждое сообщение, отправленное клиентом через этот прокси-сервер, отправляется одному и тому же экземпляру на стороне сервера.

Это поведение активации можно выбрать с помощью атрибута ServiceContract.

Ювал Лоуи написал хорошую статью об опциях создания экземпляров в WCF .

В этих вариантах экземпляров вы можете найти то, что вам подходит.

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