Проблема в использовании службы WCF (basicHttpBinding) в Delphi Win32 Client

Я пытаюсь сделать клиент Delphi (Delphi 2006) для связи со службой, написанной с использованием WCF. Сервис чертовски прост с одной функцией. Технически, как показано ниже:

[ServiceContract (Namespace = "http://www.company.com/sample/")]
public interface IService
{
    [OperationContract]
    string GetNumber (string name);
}

Я разместил этот сервис на IIS и показал его с помощью basicHttpBinding с конечной точкой mex. Я могу использовать его в клиентах .NET.

Я попытался запустить WSDLImp.exe, и он сгенерировал модуль исходного кода (кстати, он генерирует странные классы для инкапсуляции строкового типа. Почему он не может совпадать с строковым типом Delphi?). Когда я пытаюсь позвонить в эту службу, я получаю исключение:

The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

Я не вижу способа настроить клиент Delphi Win32 на изменение параметров привязки или безопасности. Как я могу решить эту проблему?

Ответы на вопрос(2)

Вам нужно посмотреть на сетевой трафик между клиентом и службой, чтобы увидеть, что происходит. Либо включите трассировку WCF для службы, возможно, включая трассировку сообщений. Вы должны быть в состоянии увидеть, что происходит, очень подробно.

Решение Вопроса

У меня была точно такая же проблема. Delphi просто нелегко импортировать WSDL, предоставляемый WCF. Одним из решений является добавление оболочки ASMX к вашей службе и ее использование с клиентами Delphi.

Вот пример:

[ServiceContract (Namespace = "http://www.company.com/sample/")]
public interface IService
{
    [OperationContract]
    string GetNumber (string name);
}

public class Service : IService
{
    public string GetNumber (string name)
    {
        return Repository.GetNumber(name);
    }
}

[WebService(
    Namespace = "http://www.company.com/sample/",
    Name = "wstest",
    Description = "description")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class AsmxService : WebService
{
    [WebMethod]
    public string GetNumber(string name)
    {
        return Repository.GetNumber(name);
    }
}

Ваш ответ на вопрос