Как спроектировать и реализовать простое сервисное реле WCF? - PullRequest
3 голосов
/ 15 декабря 2008

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 15 декабря 2008

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

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

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

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

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

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

Джо.

2 голосов
/ 15 декабря 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;
}

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

1 голос
/ 17 марта 2010

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

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