Как программно добавить ссылку на службу данных WCF (ODATA) в silverlight - PullRequest
0 голосов
/ 17 января 2012

У меня запущена служба данных Oata, т.е. WCF. Возможно ли для клиента Silverlight программно добавить ссылку на эту службу только с URL-адресом службы?

В настоящее время я добавляю ссылку на сервис, щелкнув правой кнопкой мыши проект, добавив ссылку на сервис, Обнаружение, а затем добавив ссылку на сервис. Как я могу сделать это программно?

Ответы [ 2 ]

2 голосов
/ 17 января 2012

Это невозможно по нескольким причинам, пара из них здесь:

  • Добавление ссылки на службу в Visual Studio создает код (классы на стороне клиента для сущностей и других типов, предоставляемых службой). Silverlight не имеет необходимых библиотек, чтобы справиться с этой задачей достаточно легко (для этого нужно было бы переписать / перенести большую часть кода в silverlight).

  • Чтобы ваш код действительно использовал его, вам необходимо скомпилировать сгенерированный код. В SL нет способа сделать это, так как он не содержит компиляторов.

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

Если вы хотите написать клиентское приложение, которое может получить доступ к произвольной службе OData, я бы посоветовал вам взглянуть на Microsoft.Data.OData.dll. Это часть недавнего ОСАГО: http://blogs.msdn.com/b/astoriateam/archive/2011/10/13/announcing-wcf-data-services-oct-2011-ctp-for-net-4-and-silverlight-4.aspx И это реализует читателей и писателей для формата OData (что-то вроде XmlReader / XmlWriter, но для OData). В частности, он не требует знания службы заранее, он может прочитать любой ответ OData.

0 голосов
/ 17 января 2012

Вы должны сделать следующее:

BasicHttpBinding binding = new BasicHttpBinding();
var endpoint = new EndpointAddress("<Yours Endpoint Address>");
var factory = new ChannelFactory<IYourServiceContract>(basicHttpBinding, endpointAddress);

Надеюсь, это поможет.

...