WCF - Обобщающая строка действия - PullRequest
1 голос
/ 22 апреля 2011

Мне нужно взять некоторые заранее определенные WSDL (я не контролирую их) и выставить их на нашем устройстве для ответа на различные запросы SOAP / UPnP.

В любом случае, у меня все это работает, но проблема возникает, потому что у меня есть одна услуга, которую можно запрашивать на любом количестве каналов.Я объясню:

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:1", ConfigurationName="myInterface")]
public interface myInterface
{
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:1#GetConfiguration", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute()]
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")]
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request);
}

По сути, то, что я пытаюсь сделать (я понимаю, что этот синтаксис совершенно неправильный, но я думаю, что это поможет понять смысл), это:

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

Единственный способ, которым я мог бы реализовать это, - это указать какой-то другой метод, назовем его Dispatcher with Action = "*", а затем вручную проанализировать полученное действие, используяOperationContext.Current.IncomingMessageHeaders.Action.Это просто кажется очень сомнительным способом ведения дел.Я уверен, что основным препятствием на этом пути является моя неопытность в WCF.

Любая помощь, которую вы сможете оказать, будет высоко оценена.

Спасибо,

Ответы [ 2 ]

1 голос
/ 22 апреля 2011

Единственным обобщением метода действия является подстановочный знак *, и он обычно используется как с вводом, так и с выводом как общий Message.

Существует способ настроить все поведение выбора операции и параметровопределение и заполнение.Вы можете проверить следующие интерфейсы:

  • IDispatchOperationSelector используется для выбора операции на основе поступающих данных
  • IOperationInvoker используется для распределения параметров и вызова операции, выбранной IDispatchOperationSelector
  • IDispatchMessageFormatter используется для заполнения параметров операции выделенным слотам, подготовленным IOperationInvoker

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

1 голос
/ 22 апреля 2011

Самый простой способ справиться с этим - создать универсальный обработчик сообщений.Контракт будет выглядеть примерно так:

[ServiceContract(SessionMode = SessionMode.Allowed)]
public interface ICatchAll
{
    [OperationContract(IsOneWay = false, Action = "*", ReplyAction = "*")]
    Message ProcessMessage(Message message);
}

Идея состоит в том, что вы создаете метод "маршрутизатора" для своего сервиса в соответствии с положениями этой статьи.создайте индивидуальные контракты на обслуживание канала, чтобы сформировать мыльное сообщение, которое будет получено и возвращено, но конечная точка клиента перейдет к конечной точке службы «маршрутизатор».Возможно, вы сможете сделать что-то в этом направлении с новым WCF 4 RoutingService, если создадите отдельный экземпляр каждого контракта на обслуживание канала.

...