Нашел решение. Он состоит из нескольких частей и требует нескольких изменений на стороне C #, больше на стороне Delphi. Обратите внимание, что это было протестировано с Delphi 2007 и Visual Studio 2008.
C # сторона:
Используйте BasicHttpBinding вместо WSHttpBinding.
Фикс Шаг 1
BasicHttpBinding myBinding = new BasicHttpBinding();
myBinding.Security.Mode = BasicHttpSecurityMode.None;
Это изменение разрешит ошибки application / soap + xml на стороне Delphi.
Delphi 2007 сторона:
Запуск с измененным веб-сервисом C # теперь будет генерировать такие ошибки:
Исключительный класс ERemotableException
с сообщением «Сообщение с действием»
'' не может быть обработано в
получатель, из-за ContractFilter
несоответствие в EndpointDispatcher.
Это может быть из-за
несоответствие контракта (несоответствующие действия
между отправителем и получателем) или
несоответствие привязки / безопасности между
отправитель и получатель. Проверь это
отправитель и получатель имеют одинаковые
договор и та же обязательная
(включая требования безопасности, например,
Сообщение, Транспорт, Нет). '
Чтобы решить эту проблему, добавьте SOAPActions ко всем поддерживаемым интерфейсам. Вот пример из моего кода; это должно быть сделано ПОСЛЕ всех изменений InvRegistry, внесенных разделом инициализации import-from-WSDL-PAS-файла:
Fix Step 2
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(IVMProvisionCore), 'http://Cisco.VMProvision.Core/CoreServices/%operationName%');
Имя типа и URL должны быть получены из сгенерированного Delphi файла импорта из WSDL и / или проверки фактического WSDL. Приведенный выше пример был для моего собственного проекта. После того, как эти коды изменятся, вы увидите ошибку:
Исключительный класс ERemotableException
с сообщением 'Форматер бросил
исключение при попытке десериализации
сообщение: Ошибка в десериализации
тело сообщения запроса для
работа ....
Эта ошибка устраняется путем добавления следующего кода (кредиты http://www.bobswart.nl/weblog/Blog.aspx?RootId=5:798). Опять же, этот новый код должен быть после всех элементов InvRegistry при инициализации файла WSDL-to-PAS.
Фикс Шаг 3
InvRegistry.RegisterInvokeOptions(TypeInfo(IVMProvisionCore), ioDocument);
На этом этапе пакеты будут пересылаться между Delphi и C #, но параметры не будут работать должным образом. C # будет принимать все параметры в виде значений NULL, а Delphi, похоже, не получает параметры ответа должным образом. Последний шаг кода состоит в использовании слегка настроенного объекта THTTPRIO, который учитывает литеральные параметры. Хитрость в этой части заключается в том, чтобы убедиться, что опция применяется ПОСЛЕ интерфейса был получен; делать это раньше не получится. Вот код из моего примера (только фрагменты).
Фикс Шаг 4
var
R: THTTPRIO;
C: IVMProvisionCore;
begin
R:= THTTPRIO.Create(NIL);
C:= GetIVMProvisionCore(False, TheURL, R);
R.Converter.Options:= R.Converter.Options + [soLiteralParams];
А теперь - мое приложение Delphi 2007 может общаться с C #, автономным, не IIS, веб-сервисом WCF!