Совместимость веб-сервисов и интерфейса - PullRequest
2 голосов
/ 31 января 2009

Добавление ссылки на службу к веб-службе (это все WCF) в Visual Studio создает некоторый сгенерированный код, включая повторное подтверждение на стороне клиента представляемого интерфейса.

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

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

Я могу использовать отражение, но это ужасно. Есть ли какой-нибудь способ победить эту ложную безопасность и ввести метаданные, чтобы я мог использовать интерфейс с классом?


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

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

Три отличных ответа. Как выбрать только один? Я выбираю первое, потому что оно напрямую решает проблему, которую я сначала думал У меня было.

Ответы [ 3 ]

4 голосов
/ 31 января 2009

Если у вас уже есть контрактный dll на клиенте, вам даже не нужна ссылка на сервис (если вы не используете его для написания кода установки для вас) - вы можете просто создать подкласс ClientBase и открыть канал, и использовать это напрямую - что-то вроде (без IDE удобно ...):

public class WcfClient<T> : ClientBase<T> where T : class
{
    public new T Channel {get {return base.Channel;}}
}

Тогда вы можете просто сделать что-то вроде:

using(var client = new WcfClient<IFoo>())
{
    client.Channel.Bar(); // defined by IFoo
}

Вам все еще нужны параметры конфигурации в конфигурации, чтобы определить адрес, привязку и т. Д., Но они не так беспорядочны, как генерация прокси. Кроме того, вы можете повторно внедрить IDipsoable, чтобы справиться с тем фактом, что прокси-серверы WCF могут добавить Dispose() (что плохо):

public class WcfClient<T> : ClientBase<T>, IDisposable where T : class
{
    public new T Channel {get {return base.Channel;}}
    void IDisposable.Dispose() {
        try {
           switch(State) {
              case CommunicationState.Open: Close(); break;
              // etc
           }
        } catch {} // swallow it down (perhaps log it first)
    }
}
2 голосов
/ 31 января 2009

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

1 голос
/ 31 января 2009

Чтобы вернуть интерфейс из сервиса, вам нужно использовать атрибут KnownType:

Помогает ли что-нибудь из этого?

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