我试图让服务器应用程序使用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(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更新服务引用
有没有办法在SilverLight中使用WebChannelFactory保持"干净"的实现?也许SilverLight的公共域/开源WebChannelFactory?
任何有关这方面的帮助将不胜感激!