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

Я пытаюсь сделать клиент 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?). Когда пытаюсь вызвать эту службу, получаю исключение:

Сообщение с Action '' не может быть обработано в получателе из-за несоответствия ContractFilter в EndpointDispatcher. Это может быть из-за несоответствия контракта (несоответствия действий отправителя и получателя) или несоответствия привязки / безопасности между отправителем и получателем. Убедитесь, что отправитель и получатель имеют одинаковый контракт и одинаковую привязку (включая требования безопасности, например, сообщение, транспорт, нет).

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


person Hemant    schedule 07.07.2009    source источник


Ответы (2)


У меня была точно такая же проблема. 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);
    }
}
person Darin Dimitrov    schedule 07.07.2009
comment
Извините, но я не понимаю, что именно вы имеете в виду, говоря о добавлении оболочки ASMX. Не могли бы вы уточнить? - person Hemant; 07.07.2009
comment
Под добавлением оболочки ASMX я подразумеваю, что вы можете добавить в свое решение веб-службу ASMX, которая имеет те же методы, что и ваша служба WCF, и эти методы выполняют те же самые задачи. Как только вы добавите эту веб-службу asmx, вы получите конечную точку .asmx, которую могут использовать клиенты Delphi. - person Darin Dimitrov; 07.07.2009
comment
Я бы больше не стал переходить на ASMX: johnwsaundersiii.spaces.live.com / blog /. - person John Saunders; 09.07.2009
comment
@ Джон, я бы тоже не стал прыгать в Delphi. Но, как вы можете видеть, все еще есть люди, использующие его (включая меня), и мы должны найти решения для интеграции его с новыми технологиями (WCF). Я предложил ASMX, потому что это то, что я тестировал сам и доказал, что он неплохо работает в продакшене. - person Darin Dimitrov; 09.07.2009
comment
Я попробовал то, что предложил дарин, и действительно, Delphi, похоже, довольно хорошо интегрируется с сервисом asmx. Это было довольно гладко. - person Hemant; 10.07.2009
comment
Службы WCF созданы для использования, и не каждый потребитель является заложником Microsoft (пока). Обратная совместимость очень важна. Соответствие стандартам - это минимум, которого ожидают от уважаемой организации. - person Sam; 09.03.2011
comment
@Sam: я думаю, что это скорее проблема Delphi, чем проблема WCF. Тем не менее, я хотел бы знать, какая конкретная разница вызывает проблемы для Delphi. - person John Saunders; 09.03.2011
comment
@John, вся суть SOAP - это совместимость, поэтому мы используем HTTP и XML. Функциональная совместимость означает поддержку существующих технологий, а не только ваших собственных. М.С. мог бы играть честно, но это не обязательно, и это не ... меня это раздражает. Стандарты должны вводиться поэтапно с периодом дублирования, и это должно быть обеспечено законом. - person Sam; 10.03.2011
comment
@John, Отсутствие правового надзора в технологическом секторе вкупе с быстрыми темпами изменений фактически удерживают миллионы ИТ-работников и компаний от выкупа. Переключитесь на Microsoft версии x, иначе вы потеряете средства к существованию ... это должно быть незаконным обстоятельством, от которого люди защищены. Это называется чрезмерным влиянием. - person Sam; 10.03.2011
comment
@ Джон, это тоже мнение. - person Sam; 10.03.2011
comment
@Sam: что заставляет вас думать, что WCF несовместима? - person John Saunders; 10.03.2011
comment
@John, он не совместим со старыми наборами инструментов SOAP. Мне потребовалось 3 дня (+), чтобы получить квартиру wsdl ... и если бы не община, я бы поднялся до превербиального ручья! По общему признанию, я новичок, но я не могу принять вину за что-то настолько примитивное, что длилось так долго. .NET призван облегчить мою жизнь. Все наши оценки проектов и направление развития основаны на этом предположении, которое оказалось ошибочным. Когда из-за этого страдает проект, моя жизнь оказывается под угрозой, и я обвиняю Microsoft в том, что она не предоставила версию svcutil.exe, которая делает это. - person Sam; 10.03.2011
comment
@John, Microsoft сделала все возможное, чтобы намеренно усложнить взаимодействие с другими технологиями. Это старая история, но она имеет реальные последствия для реальных людей. Я знаю, что эксперты не потеряют из-за этого сон. - person Sam; 10.03.2011
comment
@Sam: WCF - не единственный инструментарий, который не использует простой WSDL. В некоторых случаях ASMX тоже этого не делает. Опять же, это больше похоже на проблему со старым набором инструментов, не принимающим полный стандарт WSDL (который действительно позволяет одному WSDL включать другой для повторного использования), а не на ошибку WCF, поскольку на самом деле внедрение стандарта. В той степени, в которой ASMX использует плоский WSDL, это больше связано с отсутствием функций в ASMX, а не с некоторым несоблюдением стандартов со стороны WCF. - person John Saunders; 10.03.2011
comment
@John, VS2010 должен иметь возможность экспортировать плоский wsdl за пару кликов. ScvUtil должен сделать это одним щелчком переключателя. Соблюдение стандартов - это минимум, которого ожидают от уважаемой организации, требующей выкупа на весь рынок. Стандарты должны вводиться поэтапно с периодом перекрытия ... yadda yadda yadda - person Sam; 10.03.2011
comment
@Sam: Я уверен, что Microsoft поблагодарит вас за помощь в разработке их следующего выпуска Visual Studio. Поделитесь этим с ними на странице connect.microsoft.com/visualstudio. - person John Saunders; 10.03.2011
comment
@Sam: стандарт WSDL всегда разрешал включенные WSDL, а стандарт схемы XML всегда разрешал включенные XSD. Вы действительно здесь лаете не на то дерево. Вы должны пожаловаться поставщику инструмента, который может обрабатывать только плоский WSDL. - person John Saunders; 10.03.2011
comment
@John, Полегче, я скажу им раскомментировать код, который заставляет его работать для всех (а не только для тех, кто использует другие технологии MS). WCF уже обрабатывает и то, и другое, но достичь одного намеренно гораздо труднее. Вы также не можете осознать человеческую цену быстрых технологических изменений. - person Sam; 10.03.2011

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

person John Saunders    schedule 09.07.2009
comment
Это ответ и мнение! +1 - person Sam; 09.03.2011