14: HttpStatusCode.NotFound;
15: }
16: return employee;
17: }
18:
19: public void Create(Employee employee)
20: {
21: employees.Add(employee);
22: }
23:
24: public void Update(Employee employee)
25: {
26: this.Delete(employee.Id);
27: employees.Add(employee);
28: }
29:
30: public void Delete(string id)
31: {
32: Employee employee = this.Get(id);
33: if (null != employee)
34: {
35: employees.Remove(employee);
36: }
37: }
38:
39: public IEnumerable
40: {
41: return employees;
42: }
43: }
值得一提的是,不论是用于获取某个指定ID的员工信息的Get方法,还是用于修改和删除员工记录的Update和Delete方法,当指定ID的员工不存在时都通过WebOperationContext表示当前Web操作上下文的对象将回复状态设置为NotFound(即404 Not Found),这体现了我们的服务是基于Web的。
接下来我们通过自我寄宿的方式对上面定义的EmployeesService服务进行寄宿,下面是相应的配置。我们为寄宿的服务添加了唯一一个终结点,并简单地指定了其ABC三要素。和我们之前配置的终结点不同的是,在这里我们采用的绑定类型为WebHttpBinding。
1:
2:
3:
4:
5:
6: binding="webHttpBinding"
7: contract="Artech.WcfServices.Service.Interface.IEmployees"/>
8:
9:
10:
11:
最终我们通过如下的程序进行服务的寄宿。之前我们总是使用基于服务类型创建的ServiceHost进行服务寄宿,在这里我们使用的是ServiceHost它的子类WebServiceHost。
1: using (WebServiceHost host = new WebServiceHost(typeof(EmployeesService)))
2: {
3: host.Open();
4: Console.Read();
5: }
三、进行服务调用
由于我们寄宿的服务完全是基于Web的,所以和普通的Web站点没有本质的区别。由于EmployeesService服务的GetAll和Get操作支持HTTP-GET请求,所以我们完全可以在浏览器中针对操作的地址发起请求,而返回的数据可以直接显示在浏览器上。下图所示的是通过浏览器调用GetAll操作(http://127.0.0.1:3721/employees/all)得到的结果,我们可以看到所有员工的列表以XML的形式返回。
我们也可以通过浏览器调用Get操作并直接通过在地址中指定员工的ID(http://127.0.0.1:3721/employees/001)并得到以XML表示的基于相应员工的信息。下图所示XML正式ID为001的Employee对象序列化后的结果。如果在请求地址中指定一个不存在的ID(比如http://127.0.0.1:3721/employees/003),由于Get方法中指定了回复状态为NotFound,我们会得到类似于访问资源不存在的错误信息,就像访问一个不存在的Web页面一样。
上面我们演示了通过浏览器以HTTP-GET方式请求操作地址的方式从而直接将返回结果呈现出来,现在我们来演示如何使用通过ChannelFactory
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12: address="http://127.0.0.1:3721/employees"
13: behaviorConfiguration="webBehavior"
14: binding="webHttpBinding"
15: contract="Artech.WcfServices.Service.Interface.IEmployees"/>
16: