【问题标题】:What's the most portable way to make a Silverlight & Regular .NET REST client制作 Silverlight 和常规 .NET REST 客户端的最便携方式是什么
【发布时间】:2010-09-21 14:44:45
【问题描述】:

我正在尝试让服务器应用程序使用 WCF 公开一些状态信息。 特别是我在使用带有 RESTful“API”的 WCF 服务之后。 在从 silverlight 使用 REST api 时,我遇到了一些困难 我想拥有的应用程序/页面作为附加类型的客户端...

到目前为止,我已经成功定义了一个状态界面:

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);

我遇到的“墙”是 SliverLight 没有 WebChannelFactory。

期间。

这意味着当谈到 silverlight 代码时,我的选择是:

  • 使用 WebClient 编写丑陋的代码, 这最终意味着我将拥有 随时更新两组代码 我的 API 发生了变化
  • 为 WebService 使用 SOAP/WS 并保持 更新服务参考 视觉工作室

有没有办法让 SilverLight 中的 WebChannelFactory 实现“干净”? 或许是 SilverLight 的公共领域/开源 WebChannelFactory?

对此的任何帮助将不胜感激!

【问题讨论】:

    标签: .net wcf .net-3.5 rest silverlight-2.0


    【解决方案1】:

    我几乎不想推荐它,但你觉得reimplementing the WebChannelFactory<T> class 舒服吗?

    粗略浏览一下 Silverlight API,您似乎不会从 Microsoft 开箱即用地获得太多帮助。您需要为它重新实现一个通道类和一个工厂。

    也许创建通道并将自己与特定于平台的代码隔离开来的另一种方法是创建它的自定义实现?具体而言,我的意思是,您创建了另一个工厂类,并且工厂类在可用时调用 WebChannelFactory,或者为您进行设置。

    抱歉,我没有更深入的建议。 :)

    【讨论】:

    • 我想我会按照你的建议重新实现工厂类。我想我会使用像 LinFu 这样的东西来完成所有繁重的工作。我只需要看看 LinFu 是否适用于 Silverlight
    【解决方案2】:

    如果这是一个简单的 Xml REST 服务,为什么不使用 Silverlight 中的 WebClient 来使用 Linq to XML 捕获 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 
    

    我对来自 WCF 和 Silverlight 的本地 REST 服务做了同样的事情,效果很好。

    【讨论】:

    • 我不喜欢这种解决方案,因为它在客户端和服务器之间创建了一种未在代码中表达的依赖关系。如果我要重构/更改我的服务工作方式,我基本上必须确保在服务器 + 客户端中进行了更改。代理消除了这种需求。
    【解决方案3】:

    到目前为止,我已经找到了 WebChannelFactory 的一些替代方案,用于在 Silverlight 中使用 REST 服务。他们都在论坛和博客上看到了赞誉,但我自己还没有尝试过。我相信这三个都使用泛型轻松地将请求响应反序列化为 CLR 对象。

    我倾向于 RestSharp,因为它的示例在我看来既简单又可扩展。

    【讨论】:

      【解决方案4】:

      【讨论】:

        【解决方案5】:

        我最近遇到了同样的问题,并决定为 Silverlight 创建一个具有简化 REST 客户端接口的类,或多或少类似于 WebChannelFactory。也有类似同步的行为。

        http://regular-language.blogspot.com/2011/06/wcf-webhttp-rest-client-for-silverlight.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-07
          • 2010-12-12
          • 1970-01-01
          • 1970-01-01
          • 2018-06-15
          • 2020-06-14
          • 1970-01-01
          • 2013-01-01
          相关资源
          最近更新 更多