我正在尝试让服务器应用程序使用 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 并不断更新 Visual Studio 中的服务引用
有没有办法在 SilverLight 中使用 WebChannelFactory 保持“干净”的实现?或许是 SilverLight 的公共领域/开源 WebChannelFactory?
对此的任何帮助将不胜感激!