2008-11-10 2 views
5

Я пытаюсь получить приложение сервера, чтобы выдать некоторую информацию о статусе с помощью WCF. В частности, я использую службы WCF с RESTful «API». Я бил несколько стен, когда дело доходит до потребления АНИ REST из SilverLight приложения/страницы, которую я хочу иметь в качестве дополнительного вида клиента ...Какой самый переносимый способ сделать Silverlight & Regular .NET 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 консольного/winfoems/WPF приложения с помощью что-то вдоль линии это:

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

«стена» Я ударять, что есть НЕТ WebChannelFactory для SliverLight.

Период.

Это означает, что, когда дело доходит до SilverLight кода, мои варианты:

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

Есть ли способ сохранить «чистую» реализацию с помощью WebChannelFactory в SilverLight? Возможно, общественное достояние/open source WebChannelFactory для SilverLight?

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

+0

Прогресс на этом? – andrecarlucci 2010-12-20 13:06:59

ответ

1

Я почти не рекомендую это делать, но было бы удобно с reimplementing the WebChannelFactory<T> class?

Из беглого взгляда на API Silverlight похоже, что вы не получите большую помощь от Microsoft из коробки. Для этого вам необходимо переопределить класс канала и фабрику.

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

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

+0

Я думаю, что буду следовать вашему предложению о повторной реализации фабричного класса. Я думаю, что я буду использовать что-то вроде LinFu, чтобы сделать весь тяжелый подъем. Мне просто нужно посмотреть, работает ли LinFu на Silverlight – damageboy 2008-11-17 09:02:31

+0

@damageboy на любом прогрессе? – andrecarlucci 2010-12-20 13:07:14

1

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

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

Время 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

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

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

Смежные вопросы