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: