Какой самый портативный способ сделать клиент Silverlight & Regular .NET REST - PullRequest
5 голосов
/ 10 ноября 2008

Я пытаюсь заставить приложение сервера выставлять некоторую информацию о состоянии с помощью WCF. В частности я после использования служб WCF с RESTful "API". Я ударился о стену, когда дело доходит до потребления API REST от серебряного света приложение / страница, которую я хочу иметь в качестве дополнительного типа клиента ...

До сих пор я успешно определял интерфейс статуса:

public static class StatusUriTemplates
{
  public const string Status = "/current-status";
  public const string StatusJson = "/current-status/json";
  public const string StatusXml = "/current-status/xml";
}
[ServiceContract]
public interface IStatusService
{
  [OperationContract]
  [WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate = StatusUriTemplates.StatusJson)]
  StatusResultSet GetProgressAsJson();

  [OperationContract]
  [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = StatusUriTemplates.StatusXml)]
  StatusResultSet GetProgressAsXml();

  [OperationContract]
  [WebGet(UriTemplate = StatusUriTemplates.Status)]
  StatusResultSet GetProgress();
}

Реализация на сервере:

  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
  public class ServerStatusService : IStatusService
  {
    public StatusResultSet GetProgressAsJson()
    { return GetProgress(); }

    public StatusResultSet GetProgressAsXml()
    { return GetProgress(); }

    public StatusResultSet GetProgress()
    {
       return StatusResultSet.Empty;
    }
  }

Предоставление его из моего кода во время выполнения:

  var service = new ServerStatusService();
  var binding = new WebHttpBinding();
  var behavior = new WebHttpBehavior();

  var host = new WebServiceHost(service, new Uri("http://localhost:8000/server"));
  host.AddServiceEndpoint(typeof(IStatusService), binding, "status");
  host.Open();

Я даже успешно использовал службу из приложения .NET console / winfoems / WPF, используя что-то вроде этого:

  var cf = new WebChannelFactory<IStatusService>(new Uri("http://localhost:8000/server/status"));
  var ss = cf.CreateChannel();
  Console.WriteLine(ss.GetProgress().TimeStamp);

«Стена», на которую я попадаю, в том, что для SliverLight НЕТ WebChannelFactory.

Период.

Это означает, что когда дело доходит до кода Silverlight, у меня есть следующие варианты:

  • Напишите некрасивый код, используя WebClient, что в конечном итоге означает, что у меня будет обновлять два набора кода всякий раз, когда У меня есть изменения в моем API
  • Используйте SOAP / WS для WebService и сохраняйте обновление ссылки на услугу с Visual Studio

Есть ли способ сохранить "чистую" реализацию с помощью WebChannelFactory в SilverLight? Возможно, публичный домен / открытый исходный код WebChannelFactory для SilverLight?

Любая помощь с этим будет принята с благодарностью!

Ответы [ 5 ]

1 голос
/ 21 апреля 2011
1 голос
/ 24 ноября 2008

Если это простая служба XEST REST, почему бы не использовать WebClient в Silverlight для захвата XML с помощью Linq to XML? Я знаю, вы сказали, что это грязно, но все зависит от того, как вы на это смотрите. если вы в любой момент измените интерфейс службы, вам придется обновлять код в нескольких местах. Вот так оно и есть.

Таким образом, для этого вам нужно будет асинхронно захватывать данные из WebClient и затем анализировать их с помощью LINQ to XML.

Time Heuer имеет хороший пример на своем сайте: http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

По сути, это выглядит так:

WebClient rest = new WebClient();
rest.DownloadStringCompleted += new DownloadStringCompletedEventHandler(rest_DownloadStringCompleted);
rest.DownloadStringAsync(new Uri("http://example.org/current-status/xml"));

Затем в вашем rest_DownloadStringCompleted вы проанализируете строку как XML. Вот так:

string data = e.Result;
string url = string.Empty;

XDocument doc = XDocument.Parse(e.Result);
var myResults = from results in doc.Descendants("myXmlElement") ... blah blah blah 

Я проделал то же самое с REST Services от WCF и Silverlight, и он отлично работал.

1 голос
/ 20 апреля 2011

До сих пор я нашел несколько альтернатив WebChannelFactory для использования служб REST в Silverlight. Все они видели похвалу на форумах и в блогах, но я еще не попробовал ни одного из них сам. Я полагаю, что все три используют дженерики для простой десериализации ответов на запросы в объекты CLR.

Я склоняюсь к RestSharp, потому что его примеры кажутся мне простыми и расширяемыми.

1 голос
/ 12 ноября 2008

Я почти не хочу предлагать это, но вы бы чувствовали себя комфортно с "> повторной реализацией WebChannelFactory class ?

Из беглого взгляда на API-интерфейс Silverlight кажется, что Microsoft не получит особой помощи из коробки. Вам нужно переопределить класс канала и фабрику для него.

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

Извините, у меня нет более подробного предложения. :)

0 голосов
/ 12 июня 2011

Недавно я столкнулся с той же проблемой и решил создать класс с упрощенным клиентским интерфейсом REST для Silverlight, более или менее похожим на WebChannelFactory. Имеет синхронное поведение.

http://regular -language.blogspot.com / 2011/06 / ФОС-webhttp-отдых-клиент-для-silverlight.html

...