Подключить LinqPad к веб-сервису WCF с помощью запроса URI wsdl

Я хочу подключить LinqPad к веб-службе WCF, которая предоставляет свою информацию WSDL в URI формы http://server.example.com/Product/Service/Version/Soap11?wsdl. Я могу успешно добавить этот URI в качестве ссылки на веб-службу Visual Studio WCF, и он также работает с WcfTestClient.

Фактическая конечная точка службы при подключении к методам вызова составляет http://server.example.com/Product/Service/Soap11.

Когда я пытаюсь добавить веб-службу в качестве соединения LinqPad, если я укажу URI веб-службы, включая запрос ?wsdl, я получаю сообщение об ошибке LinqPad с сообщением "ArgumentException: ожидаемый абсолютный, хорошо сформированный URL-адрес http без запрос или фрагмент. Имя параметра: serviceRoot". Если я опускаю запрос ?wsdl, вместо этого получаю ответ 400 Bad Request.

(Я получаю тот же ответ 400 Bad Request, когда пытаюсь создать ссылку на веб-службу Visual Studio, или добавьте службу в WcfTestClient, не добавляя ?wsdl в URI).

Есть ли что-нибудь, что я могу изменить на стороне клиента, чтобы LinqPad смог успешно подключиться к этому веб-сервису? Или мне нужно возиться с конфигурацией на сервере? Я не контролирую веб-службы, к которым я пытаюсь подключиться, но я могу настроить некоторые файлы конфигурации на сервере, если это необходимо.

Ответы

Ответ 2

Похоже, я неверно истолковал область действия LINQPad "Добавить соединение". Это только для служб данных WCF (которые реализуют спецификацию OData), а не для веб-служб WCF в целом. (Разница между службами WCF в целом и службами данных WCF специально ранее мне не была понятна).

Службы, к которым я пытаюсь подключиться, являются веб-службами WCF, но не являются веб-службами службы WCF Data Service. Оказывается, правильный способ использования этих веб-сервисов из LINQPad состоит в том, чтобы сгенерировать код прокси-класса и файл конфигурации с помощью svcutil.exe, который затем может быть скомпилирован через VS или csc.exe, и затем добавляется итоговая сборка как стандартная ссылка на сборку в LINQPad. Затем прокси-классы можно использовать в LINQPad так же, как они используются в Visual Studio.

Ответ 3

Это действительно зависит от того, где ваши сильные стороны. Нелегко судить по этому вопросу, поскольку он описывает только попытки запуска автоматизированных инструментов. Вопросы в SO обычно имеют "то, что я пробовал до сих пор". Это не только поощрение усилий до публикации, но и возможность узнать, какие варианты можно предложить.

Один большой вопрос заключается в том, что вы знаете достаточно (или готовы прочитать) работу функции ссылки на службу добавления, чтобы воспроизвести ее в коде. Или если вы можете найти проект с открытым исходным кодом с надлежащим лицензированием, чтобы использовать его.

Я бы посоветовал вам заглянуть в запись значений LINQPad.

Ответ 4

Я предложу альтернативный ответ, который поможет, если вы ориентируетесь на службу, использующую аутентификацию. В моем случае служба использует аутентификацию Windows, которую мыльный драйвер linqpad пока не поддерживает. Вы будете генерировать код клиента с помощью svcutil.exe, компилировать его в сборку и затем создавать запрос Linqpad для его использования.

  1. Создайте свой сервисный клиент & файл конфигурации с svcutil.exe http://mylocalsite/myservice.svc - он должен создать файл myservice.cs и output.config.

  2. Скомпилируйте клиентский код в сборку: csc myservice.cs /target:library. Теперь у вас должен быть myservice.dll.

  3. Создайте запрос linqpad и перейдите в его свойства (F4). На вкладке App.config установите пользовательский путь к файлу output.config. В разделе "Дополнительные ссылки" добавьте ссылку на myservice.dll.

Ваш запрос будет очень простым, что-то вроде:

var client = new MyServiceClient("BasicHttpBinding_IMyService");

var result = client.DoTheThing();

result.Dump();

client.Close();

LinqPad, скорее всего, предложит вам добавить ссылку на System.Web.Services.