Ошибка в справке по службе - работа с атрибутом MessageContractAttribute и параметрами других типов

Я создал прокси-класс для сторонней внешней веб-службы asmx с помощью svcutil.exe.

Локально на моей машине разработки все работает нормально, но при развертывании на сервере я получаю следующую ошибку:

Произошла ошибка связи со службой TBS: не удалось загрузить операцию ProcessNotificationAsync, поскольку она имеет параметр или возвращаемый тип типа System.ServiceModel.Channels.Message или тип, который имеет MessageContractAttribute и другие параметры разных типов. При использовании System.ServiceModel.Channels.Message или типов с MessageContractAttribute метод не должен использовать какие-либо другие типы параметров.

Теперь я понимаю причину этой ошибки, потому что, согласно MSDN:

Вы можете использовать класс Message как входной параметр операции, возвращаемое значение операции или и то, и другое. Если сообщение используется где-либо в операции, применяются следующие ограничения: • Операция не может иметь никаких параметров out или ref. • Не может быть более одного входного параметра. Если параметр присутствует, он должен быть либо сообщением, либо типом контракта сообщения. • Тип возврата должен быть либо недействительным, либо сообщением, либо типом контракта сообщения.

Когда я смотрю в сгенерированный файл кода, я вижу:

  public System.Threading.Tasks.Task<ProcessNotificationResponse> ProcessNotificationAsync(int aNotificationID, string aComponentParam)

что, похоже, нарушает приведенные выше правила, потому что ProcessNotificationResponse - это MessageContractAttribute и другие примитивные типы параметров.

Почему это работает на одной машине, а не на другой? Я ожидал, что это приведет к ошибке на обеих машинах.


person BROTES DE GERMINADOS    schedule 10.06.2014    source источник
comment
У меня происходит очень похожая вещь. Подключение к веб-службе через WCF отлично работает на моей машине разработки. При попытке развернуть я получаю сообщение об ошибке, которое вы видите выше. Вы выяснили причину этого?   -  person DarrenNavitas    schedule 25.06.2014
comment
Нет. Это полная загадка. К счастью, мне не нужны оскорбительные методы, поэтому я закомментировал их в сгенерированном файле кода.   -  person BROTES DE GERMINADOS    schedule 10.07.2014
comment
Просто чтобы вы знали - для меня проблема была решена заказчиком, переустановившим инфраструктуру .net, на которой была построена служба. Как только они это сделали - все заработало.   -  person DarrenNavitas    schedule 08.08.2014


Ответы (2)


У меня была именно эта проблема. Два компьютера разработчиков работали, производственный компьютер выдал эту ошибку. Оказывается, это связано с тем, что .net 4.5 поддерживает вызовы ASYNC, а .net 4.0 - нет. На производственном компьютере был запущен сервер 2003, на котором .net 4.5 не работает.

Решением было понизить версию проекта до .net 4.0, а также удалить и повторно добавить ссылку. Если установлено значение .net 4.0, асинхронные вызовы не добавляются. Теперь он работает на производственном компьютере.

Если бы рабочий компьютер мог запустить .net 4.5, установка .net 4.5 решила бы проблему.

person user2300846    schedule 19.08.2014
comment
Ага - здесь это тоже исправлено. Спасибо. - person BROTES DE GERMINADOS; 19.09.2014

Я столкнулся с той же проблемой. Я звонил в какую-то стороннюю службу WCF. Много искал. Наконец обнаружил, что служба wcf была построена в версии FW 4.5, а мой веб-сайт asp.net был ориентирован на версию FW 3.5. Затем тщательно проверил прокси-класс службы и увидел, что служба предоставила некоторые методы Async, которые возвращали System.Threading.Tasks версии FW 4.5. Просто прокомментировал весь код, связанный с FW 4.5. Но, к счастью, в моих реальных методах вызова их не было. Вещи начали работать нормально.

Другим решением может быть преобразование вашего проекта asp.net в версию FW 4.5. Я протестировал это с помощью простого тестового приложения, не комментируя какие-либо строки в прокси-классе, и он также работал нормально.

person Saikat Chakraborty    schedule 08.09.2015