Как разработать и реализовать простой сервис-ретранслятор WCF?

Мы находимся в процессе разработки простой сервис-ориентированной архитектуры с использованием WCF в качестве среды реализации. Есть несколько сервисов, которые используют несколько приложений. Эти службы в основном используются внутри компании, поэтому достаточно простой схемы аутентификации и авторизации (например, на базе Windows).

Однако мы хотим предоставить некоторые услуги некоторым деловым партнерам. Набор услуг, к которым они имеют доступ, зависит от контракта. Вид стандартной архитектуры.

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

Как я могу спроектировать и реализовать такой ретранслятор / маршрутизатор в WCF, сделав его очень простым? Я прочитал хорошую книгу Inside Windows Communication Foundation, но я Я все еще не уверен, с чего начать.


person Dario Solera    schedule 15.12.2008    source источник


Ответы (3)


Я сделал что-то очень похожее на это. Что вы можете сделать, так это предоставить конечную точку с помощью одной операции.

Эта операция будет выглядеть примерно так

[OperationContract(Namespace="www.fu.com", Action="*")]
void CallThis(Message msg);

Попросите своих клиентов использовать прокси-сервер, который предназначен для службы, которую они намеревались вызывать для выполнения нужной им операции. Затем попросите их изменить конфигурацию, чтобы указать на вашу конечную точку / службу. Метод «CallThis» примет любую операцию, независимо от ее подписи. Параметр сообщения - это сообщение WCF.

Сделайте то, что вам нужно сделать, чтобы определить, куда должны идти дела, но вам нужно будет изменить «Кому», чтобы перейти к вашей внутренней конечной точке.

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

Джо.

person Joseph DeCarlo    schedule 15.12.2008
comment
Спасибо, изучаю этот вариант. Проблема в том, что я не уверен, как вернуть ответ, сгенерированный внутренней службой, внешнему инициатору запроса. - person Dario Solera; 15.12.2008
comment
Хорошая точка зрения. Моя имплантация использует односторонние сообщения, поэтому мне не нужно с этим сталкиваться. Использование атрибута Action = * заставляет этот вызов быть выше в стеке WCF. Таким образом, во время вашего вызова не происходит сериализации типов. Вы должны иметь возможность поместить возвращаемый тип сообщения, и он должен работать. - person Joseph DeCarlo; 15.12.2008
comment
Дарио: Вы по-прежнему должны иметь возможность использовать обработчик catch all, как указано выше, и возвращать экземпляр сообщения; это не обязательно должна быть односторонняя операция. - person tomasr; 16.12.2008

Кажется, достаточно построить интерфейс следующим образом:

[OperationContract(Action="*", ReplyAction="*")]
Message CallThis(Message msg);

Я также нашел этот пост полезным для реализации CallThis путем "возни" с объектами Message. Ниже приводится базовая реализация метода CallThis:

public Message CallThis(Message message) {
    MessageBuffer buffer = message.CreateBufferedCopy(524288);
    Message output = buffer.CreateMessage();
    output.Headers.To = <INTERNAL_SERVICE_URI>;

    BasicHttpBinding binding = new BasicHttpBinding();
    IChannelFactory<IRequestChannel> factory = binding.BuildChannelFactory<IRequestChannel>(<INTERNAL_SERVICE_URI>);
    factory.Open();

    IRequestChannel channel = factory.CreateChannel(new EndpointAddress(<INTERNAL_SERVICE_URI>));
    channel.Open();

    Message result = channel.Request(output);

    message.Close();
    output.Close();
    factory.Close();
    channel.Close();

    return result;
}

Добавление аутентификации и авторизации должно быть довольно простым.

person Dario Solera    schedule 15.12.2008

Ознакомьтесь с этим вопросом SO, где один из ответов предполагает RoutingService .NET 4. Очень красивое дополнение к WCF.

person Emmanuel    schedule 17.03.2010
comment
Небольшое примечание относительно маршрутизации WCF. Он не поддерживает REST, насколько мне известно, вы должны отправлять SOAP. - person Sanjay Uttam; 09.11.2013