在开发各种网络服务时,可以通过多种方式为PC创建客户端代理:在Visual Studio中添加服务引用,或者简单地在命令行中设置参数,使用svcutil.exe工具,接收退出代码和配置文件。但是,如果业务涉及便携设备,如Pocket PC或智能手机,应该怎么做呢?幸运的是,这个问题有一个解决方案,将在本文中描述。
例如,将在Visual Studio2008中创建一个新的WCFWeb服务- 文件 -> 新建 -> 项目 -> Web -> WCF服务应用程序,命名为BooksService。然后,创建必要的数据类型和函数后,启动Web服务。它可能在IIS 6.0/7.0中,或者在内置的VS2008 ASP.NET开发服务器中。现在,可以问一个合理的问题 - 如何从口袋计算机连接到服务?幸运的是,除了编写自己的代理类之外,还有一种更简单的方法,那就是使用工具netcfsvcutil.exe,可以从这个链接下载。然后,让在给定工具的参数中设置下一行:"http://192.168.134.10:8888/BooksService.svc"。退出时,将收到两个文件:CFClientBase.cs和BooksServie.cs。这正是所需要的。现在,将详细讲述服务的创建和方便的移动客户端。
创建此Web服务后,声明其接口如下:
[ServiceContract]
public interface IBooksService
{
[OperationContract]
string[] GetBookNames();
[OperationContract]
Book[] GetBooks(GetBookType type, string input);
[OperationContract]
Book[] GetAllBooks();
}
如所见,这段代码中使用了Book类。其实现如下:
[DataContract]
public class Book
{
[DataMember]
public string Name { get; set; }
[DataMember]
public string Author { get; set; }
[DataMember]
public string ISBN { get; set; }
[DataMember]
public decimal Price { get; set; }
[DataMember]
public string Description { get; set; }
}
public enum GetBookType
{
ISBN, Name, Author
}
但是,服务何时获取这些关于书籍的信息呢?为了避免使用如SqlServer或Oracle等数据库的复杂示例,将数据存储在XML文件data.xml中,该文件构建在App_Data文件夹中。
首先,应该创建一个新的项目Smart Device Project。之后,将有一个新纯表单和自动创建的初始化代码。在它上面,同时可以停止。正如在"问题的解决方案"部分所说,应该运行netcfsvcutil.exe,并开始使用必要的参数。应该将CFClientBase.cs和BooksService.cs文件附加到当前的项目中。现在,已经准备好了代理类的工作。让看看如何正确初始化连接到服务:
private void button1_Click(object sender, EventArgs e)
{
try
{
string remoteAddress = HelpClass.BuildUrl();
EndpointAddress endpoint = new EndpointAddress(remoteAddress);
client = new BooksServiceClient(new BasicHttpBinding(), endpoint);
comboBox1.Items.Clear();
foreach (string s in client.GetBookNames())
{
comboBox1.Items.Add(s);
}
books.Clear();
books.AddRange(client.GetAllBooks());
if (books.Count > 1)
button1.Enabled = true;
comboBox1.SelectedIndex = 0;
}
catch (Exception ex) { MessageBox.Show(string.Format("Connection Error: {0}", ex.Message)); }
}
HelpClass类已被使用:
public static class HelpClass
{
static XDocument doc = XDocument.Load(Assembly.GetExecutingAssembly().GetName().CodeBase.Substring(0, Assembly.GetExecutingAssembly().GetName().CodeBase.LastIndexOf('\\') + 1) + "settings.xml");
public static string BuildUrl()
{
return string.Format("http://{0}:{1}/BooksService.svc", doc.Root.Element("Host").Value, doc.Root.Element("Port").Value);
}
}
连接到最终点后,可以充分利用Web服务提供的所有功能。