65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 WCF 创建 REST 服务并使用 jQuery 消费它

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (21投票s)

2011年4月15日

CPOL

7分钟阅读

viewsIcon

91118

downloadIcon

3318

如何使用 WCF 创建 REST 服务并使用 jQuery 消费它。

什么是 REST?

REST = Representational State Transfer(表述性状态转移),是一种用于表示资源的架构设计。REST 通过对如何识别资源、如何通过表述操作资源以及如何包含使消息自描述的元数据施加额外的约束,从而提供统一的接口。REST 不与任何平台或技术绑定,但 Web 是唯一满足所有约束的平台。因此,任何您使用 REST 约束构建的东西,您都是在 Web 上使用 HTTP 来完成的。以下是创建 REST 服务时有用的 HTTP 方法。

HTTP方法

  • GET - 请求资源的特定表述
  • PUT - 使用提供的表述创建或更新资源
  • DELETE - 删除指定的资源
  • POST - 提交数据以供指定资源处理
  • HEAD - 类似于 GET,但只检索头部,不检索正文
  • OPTIONS - 返回指定资源支持的方法

在本文中,我将讨论如何使用 WCF 框架设计和消费 REST Web 服务。作为一个例子,我将创建一个 REST 服务,该服务可以创建、更新和选择员工。请按照以下步骤操作。

设计 URI

要设计 REST 服务,您需要设计一个 URI,为此,您需要列出服务将要公开的资源。由于我将设计一个员工创建、更新和选择服务,因此资源是员工。

现在更具体地针对操作

  • 列出员工
  • 按 ID 选择员工
  • 创建员工
  • 更新员工
  • 删除员工

例如,服务托管在本地 IIS 服务器上,其 URL 是 https:///restservices/MyRestServices.svc。在下面的讨论中,我将为每个操作设计 URL 表示

  • 列出员工
  • 获取所有员工列表的 URL: https:///restservices/MyRestServices.svc/Employees

    但是系统中有很多员工,要对员工进行筛选,请使用: https:///restservices/MyRestServices.svc/Employees?type = {type}

    注意:上述 URL 获取 URL 中指定类型 {type} 的员工列表。

    通过使用员工的唯一 ID 获取单个员工: https:///restservices/MyRestServices.svc/Employees/{EmployeesID}

    注意:在上述 URL 中,{EmployeesID} 将被员工的 ID 替换。

    上述场景的扩展:如果您想通过使用 ID 和类型来获取员工: https:///restservices/MyRestServices.svc/Employees/{EmployeesID}?type = {type}

  • 创建员工
  • 创建员工的 URL: https:///restservices/MyRestServices.svc/Employees/{employeeid}

    注意:在上述 URL 中,{EmployeesID} 将被员工的 ID 替换。

  • 更新员工
  • 更新员工的 URL 是 https:///restservices/MyRestServices.svc/Employees/{employeeid}

    注意:在上述 URL 中,{EmployeesID} 将被员工的 ID 替换。

  • 删除员工
  • 删除员工的 URL 是 https:///restservices/MyRestServices.svc/Employees/{EmployeeID}

    注意:在上述 URL 中,{EmployeesID} 将被员工的 ID 替换。

如您所见,这里创建、更新和删除的 URL 相同,但当您将 URL 与特定的 HTTP 方法结合使用时,它会产生差异。让我们将 URL(s) 与 HTTP 方法结合起来。

列出员工

  • GET - https:///restservices/MyRestServices.svc/Employees

创建/更新员工

  • PUT - https:///restservices/MyRestServices.svc/Employees/{employeeid}

注意:创建/更新员工都使用相同的 URL,但您使用 employeeid = 0 创建员工,使用 empoloyeeid = 任何数字值或 GUID 更新员工。此 URL 在您的实现中可能不同。

删除员工

  • DELETE - https:///restservices/MyRestServices.svc/Employees/{EmployeeID}

使用 REST 设计 WCF

这里有一篇文章可以更好地理解 WCF 服务: 创建、托管(自托管、IIS 托管)和消费 WCF 服务。要设计我们的 REST WCF 服务,首先从表示员工的类开始

[DataContract]
public class Employee
{
    [DataMember]
    public string Employeename { get; set; }
    [DataMember]
    public string Designation { get; set; }
    [DataMember]
    public string Address { get; set; }
    [DataMember]
    public string Email { get; set; }
}

如您所见,Employee 类具有 DataContaract 属性,因为它将为客户端提供数据,即它将作为数据交换器。现在开始创建 WCF 服务,该服务将为客户端提供数据,即作为 RESTfull 服务。您需要使用 WebInvoke 属性装饰服务接口中的每个方法,此外还有 OperationContract,它允许用户将方法与 UrlTemplate 和 HTTP 方法绑定。让我们逐一查看接口的每个方法。

public interface IService1
{

Get 方法

以下方法提供使用 HTTP 的 GET 方法请求的数据。

  • GetEmployees
  • 允许获取所有员工。“tag”允许用户筛选数据,因为有时系统可能包含大量员工,这将增加流量并减慢响应速度,因此通过指定 tag=manager 或 tag=senior,您将获得一组特定的员工。

    [WebInvoke(Method = "POST", 
            ResponseFormat = WebMessageFormat.Json,UriTemplate = "?tag={tag}")]
    [OperationContract]
    Employees GetEmployees(string tag);
  • GetEmployee
  • 允许获取具有特定 ID 的员工。UriTemplate 的“Employee_id”将被员工 ID 替换。

    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, 
        UriTemplate = "Employees/{Employee_id}")]
    [OperationContract]
    Employee GetEmployee(string Employee_id);

创建和更新方法

以下方法允许使用 HTTP PUT 方法插入新数据和更新现有数据。

  • PutEmployeeAccount
  • 此方法允许将新员工插入系统并更新现有员工。如果它是更新,UriTemplate 的“Employee_Id”将被员工 ID 替换,如果是要创建的新员工,则为 0。

    [WebInvoke(Method = "PUT", ResponseFormat = WebMessageFormat.Json, 
        UriTemplate = "Employees/{Employee_Id}")]
    [OperationContract]
    string PutEmployeeAccount(Employee Employeeobj,string Employeename );

DELETE 方法

此方法允许使用 HTTP DELETE 方法删除数据。

  • DeleteEmployeeAccount
  • 此方法允许从系统中删除员工。UriTemplate 的“Employee_Id”将被员工 ID 替换。

    [WebInvoke(Method = "DELETE", UriTemplate = "Employees/{Employee_Id}")]
      [OperationContract]
      void DeleteEmployeeAccount(string Employeename);
    }

WebInvoke

  • WebInvokeAttribute 确定服务操作响应哪种 HTTP 方法,即 HTTP POST、GET 或 DELETE。
  • 表示服务操作在逻辑上是一个调用操作,并且可以通过 REST 编程模型调用。

UriTemplate

  • URI 模板是一个类似 URI 的字符串,其中包含用大括号({,})标记的变量,它提供了一种基于模式构建和解析 URI 的一致方式。
  • URI 模板由路径和查询组成。路径由斜杠(/)分隔的一系列段组成。每个段可以具有文字值和变量值(写在大括号[{}]内)。查询部分是可选的。如果存在,它与查询字符串名称/值对相同。查询表达式的元素可以表示为(?x=2)或变量对(?x={val})。
  • 在 .NET 中添加此类的原因之一是为了支持当今开发人员使用的 REST 架构风格。

消费 WCF RESTfull 服务

在开始之前,最好了解如何使用 jQuery 配置和消费 WCF 服务: 使用 jQuery 调用 WCF 服务的步骤。以下是使用 jQuery 消费 Web 服务的代码

var Type;
var Url;
var Data;
var ContentType;
var DataType;
var ProcessData;
var method;
//Generic function to call WCF  Service
function CallService() {
   $.ajax({
      type: Type, //GET or POST or PUT or DELETE verb
      url: Url, // Location of the service
      data: Data, //Data sent to server
      contentType: ContentType, // content type sent to server
      dataType: DataType, //Expected data format from server
      processdata: ProcessData, //True or False
      success: function(msg) {//On Successfull service call
       ServiceSucceeded(msg);
      },
   error: ServiceFailed// When Service call fails
  });
 }

function ServiceFailed(result) {
   alert('Service call failed: ' + 
         result.status + '' + result.statusText);
   Type = null; 
   Url = null; 
   Data = null; 
   ContentType = null; 
   DataType = null; 
   ProcessData = null;
}

上面的代码声明并初始化了上面定义的变量,用于调用服务。CallService 函数通过在 $.ajax 中设置数据向服务发送请求。

GetEmployee

function GetEmployee() {
   var uesrid = "1";
   Type = "POST";
   Url = "Service1.svc/Employees/1";
   ContentType = "application/json; charset=utf-8";
   DataType = "json"; ProcessData = false;
   method = "GetEmployee";
   CallService();
}

GetEmployee 方法用于获取具有特定 ID 的员工。调用服务的 URL 是 Service1.svc/Employees/1:其中 1 是 employeeid。此函数调用具有 URLTemplate Employees/{Employee_Id} 且方法类型为 POST 的 RESTfull 服务函数。

CreateEmployee

function CreateEmployee() {
   Type = "PUT";
   Url = "Service1.svc/Employees/0";

    var msg2 = { "Employeename": "Denny", 
      "Designation": "engg.", 
      "Address": "vadodara", 
      "Email": "pr@ab.com" };

   Data = JSON.stringify(msg2);
   ContentType = "application/json; charset=utf-8";
   DataType = "json";
   ProcessData = true;
   method = "CreateEmployee";
   CallService();
}

此方法用于创建员工。调用服务的 URL 是 Service1.svc/Employees/Denny。其中 0 是 employeeID(0 是因为我正在创建一个新员工)。此函数调用具有 URL 模板 Employees/{Employee_Id} 且方法类型为 POST 的 RESTfull 服务函数。在 createemployee 方法中,我正在创建一个具有所需属性的 Employee 对象,该对象将由服务消费以创建员工。以下代码检查 result.GetUserResult 语句,因此您的结果对象会获得属性:您的服务方法名称 + result。否则,它将给出类似于 JavaScript 中“对象未找到”的错误。

function ServiceSucceeded(result) {
   if (DataType == "json") {
     if(method == "CreateEmployee")
     {
        alert(result);
     }
     else
     {
        resultObject = result.GetEmployeeResult;
        var string = result.Employeename + " \n " + 
            result.Designation + " \n " + 
            result.Address + " \n " + result.Email;
        alert(string);
     }
   }         
}

function ServiceFailed(xhr) {
   alert(xhr.responseText);
   if (xhr.responseText) {
      var err = xhr.responseText;
      if (err)
          error(err);
      else
          error({ Message: "Unknown server error." })
   }
   return;
 }

$(document).ready(
         function() {
             CreateEmployee();
         }
);

在本文中,我只展示了 CreateEmployeeGetEmployee 的示例,因为这足以理解如何消费 WCF RESTfull 服务的方法。现在您可以通过下载代码并更好地理解它来创建其他方法。

摘要

使用 .NET WCF 框架创建 RESTfull 服务非常容易。但它需要理解如何表示您的资源。即,设计 URL 模板以在 Web 上表示您的资源。

© . All rights reserved.