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

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

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

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

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

15.12.2008 14:08:32
3 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

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

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

Джо.

3
15.12.2008 14:31:36
Спасибо, я изучаю этот вариант. Проблема в том, что я не уверен, как вернуть ответ, сгенерированный внутренней службой, внешнему запросчику.
Dario Solera 15.12.2008 15:19:56
Хорошая точка зрения. Моя имплементация использует односторонние сообщения, поэтому мне не нужно с этим сталкиваться. Использование атрибута Action = "*" заставляет этот вызов быть выше в стеке WCF. Таким образом, во время вашего звонка не происходит сериализация типов. Вы должны иметь возможность поместить возвращаемый тип сообщения, и оно должно работать.
Joseph DeCarlo 15.12.2008 15:39:13
Дарио: Вы все еще должны иметь возможность использовать обработчик catch all, как описано выше, и возвращать экземпляр Message; это не должно быть односторонней операцией.
tomasr 16.12.2008 01:30:47

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

[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;
}

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

2
9.03.2012 21:18:53

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

1
23.05.2017 12:19:31
Просто небольшая заметка о маршрутизации WCF. Он не поддерживает REST, вы должны отправить SOAP, насколько мне известно.
Sanjay Uttam 8.11.2013 21:53:52