WCF - Обобщающая строка действия

Я должен взять некоторые заранее определенные 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);
}

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

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

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

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

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

Спасибо,

2 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам