Перегрузка действий wcfservice - PullRequest
0 голосов
/ 31 октября 2019

Возможно, я путаю некоторые вещи, но я не могу найти какие-либо вопросы или документацию по действиям по перегрузке для службы wcf, получающей сообщения SOAP.

Цель: у меня есть 3 SOAP-сообщения, поступающие в мою службу wcf с тем же именем действия в одной и той же конечной точке. Это исправлено, и я не могу изменить это.

Я бы ожидал, что будет работать следующий интерфейс wcf:

    [OperationContract(Action = "urn:oasis:names:tc:SPML:2:0:req/active", Name = "addRequest")]
    void Add(data data);

    [OperationContract(Action = "urn:oasis:names:tc:SPML:2:0:req/active", Name = "modifyRequest")]
    void Modify(psoID psoID, modification modification);

    [OperationContract(Action = "urn:oasis:names:tc:SPML:2:0:req/active", Name = "deleteRequest")]
    void Delete(psoID psoID);

Проблема: Если у меня только один действующий контракт, как это, мой сервис работает, ноесли у меня есть несколько операционных контрактов, появится следующее сообщение об ошибке: `

500System.ServiceModel.ServiceActivationException

Я считаю, что не может быть несколько операционных контрактов с одним и тем же именем действия. Я также считаю, что это должно быть возможно, потому что я заменяю сервис мыла, который обрабатывает все 3 сообщения с одинаковым именем действия. (wcf и мыло не должны быть так далеко?)

Я добавил операционные имена, чтобы исправить проблему, но без удачи.

Любая помощь будет оценена. Спасибо!

1 Ответ

1 голос
/ 04 ноября 2019

Свойство Action указывает адрес клиентского запроса, который будет отправлен на сервер, и определяет метод, вызываемый на стороне сервера. Вот клиентский запрос, захваченный Fiddler.

POST http://10.157.13.69:21011/ HTTP / 1.1
Тип содержимого: text / xml; charset = utf-8
SOAPAction:"urn: oasis: names: tc: SPML: 2: 0: req / active"
Хост: 10.157.13.69:21011
Длина контента: 162
Ожидается: 100-продолжить
Принять-Кодировка: gzip, deflate
Соединение: Keep-Alive

HTTP-заголовок SOAPAction - это имя действия операции. Свойство Name определяет имя практического метода на стороне клиента.

ServiceReference1.ServiceClient client = new ServiceClient();
                client.addRequest(23);

Таким образом, если мы не изменим веб-службу WCF с веб-службы SOAP на Rest API, в противном случае эта функция не может быть реализована, посколькустиль адресации веб-службы SOAP зависит от поля «Действие».
А именно, нам нужно изменить службу на Restful API с помощью привязки Webhttp.

[OperationContract(Action = "urn:oasis:names:tc:SPML:2:0:req/active", Name = "addRequest")]
[WebGet]
void Add(int data);

Не стесняйтесь сообщать мне, есть ли что-то, что яможет помочь с.

...