[转自雨痕]RESTful WCF

原文:http://www.rainsts.net/article.asp?id=651

 

REST 最近很热门……
WCF 3.5 增加了对 REST 的支持 —— System.ServiceModel.Web。

对我而言 REST 并不是用来取代 WebService/WCF 的,它更多的是一种架构层面而非技术层面的概念和标准。使用唯一资源定位地址 URI,加上 HTTP 请求方法从而达到对一个发布于互联网资源的唯一描述和操作。这会带来很多好处:

1. 资源的唯一性

对下面这两个 URI 而言,搜索引擎会把它当作两个不相同的资源抓取,然后有可能被去重…… (这着实是件苦恼的事情)

http://www.xxx.com/product/123
http://www.xxx.com/product/123?op=delete

而使用 REST 进行表达,那么只有 "http://www.xxx.com/product/123" 才是资源的唯一地址,我们可以使用 HTTP 方法 GET 请求信息,使用 DELETE 来删除。

GET /product/123 HTTP/1.1
DELETE /product/123 HTTP/1.1

2. 更好的交互集成能力

相较 WCF、WebService 使用 SOAP、WSDL、WS-* 而言,几乎所有的语言和网络平台都支持 HTTP 请求。我们无需去实现复杂的客户端代理,无需使用复杂的数据通讯方式既可以将我们的服务暴露给任何需要的人,无论他使用 VB、Ruby、JavaScript,甚至是 HTML FORM,或者直接在浏览器地址栏输入。

这种方式是对外的,在内部具体的实现上,我们还是需要依赖某种特定的技术方案,包括我们今天要提到的 WCF 3.5 web。

REST 看似简单,但却不是个浅白的话题。每个人都有自己的理解和使用方式,它的出现带来了一种新的希望。

----- 迷糊的分割线 ---------------

WCF 3.5 引入了 WebGetAttribute、WebInvokeAttribute、UriTemplate 来增加对 REST 的支持,这使得我们用很简单的方式就可以实现 RESTful WCF Service。

[DataContract]
public class User
{
  [DataMember]
  public string Name { get; set; }

  [DataMember]
  public int Age { get; set; }
}

[ServiceContract]
public interface IMyService
{
  [OperationContract]
  [WebInvoke(UriTemplate = "User/{name}/{age}", Method = "POST",
    ResponseFormat = WebMessageFormat.Json)]
  User CreateUser(string name, string age);

  [OperationContract]
  [WebGet(UriTemplate = "User/{name}", ResponseFormat = WebMessageFormat.Json)]
  //[WebInvoke(UriTemplate = "User/{name}", Method = "GET",
  //  ResponseFormat = WebMessageFormat.Json)]
  User GetUser(string name);

  [OperationContract]
  [WebInvoke(UriTemplate = "User/{name}", Method = "DELETE",
    ResponseFormat = WebMessageFormat.Json)]
  string DeleteUser(string name);

  [OperationContract]
  [WebInvoke(UriTemplate = "User/{name}", Method = "PUT",
    ResponseFormat = WebMessageFormat.Json)]
  string UpdateUser(string name);
}

public class MyService : IMyService
{
  public User GetUser(string name)
  {
    return new User { Name = name, Age = 12 };
  }

  public string DeleteUser(string name)
  {
    return "DELETE...";
  }

  public User CreateUser(string name, string age)
  {
    return new User { Name = name, Age = int.Parse(age) };
  }

  public string UpdateUser(string name)
  {
    return "UPDATE...";
  }
}

class Program
{
  static void Main(string[] args)
  {
    var host = new WebServiceHost(typeof(MyService), new Uri("http://localhost:81"));
    host.Open();

    var client = new WebClient();
    client.Headers.Add("content-type", "application/x-www-form-urlencoded");

    // POST /GetUser/tom/21 HTTP/1.1
    var s1 = client.UploadString("http://localhost:81/User/tom/21", "POST", String.Empty);
    Console.WriteLine(s1);

    // GET /GetUser/tom HTTP/1.1
    var s2 = client.DownloadString("http://localhost:81/User/tom");
    Console.WriteLine(s2);

    // DELETE /GetUser/tom HTTP/1.1
    var s3 = client.UploadString("http://localhost:81/User/tom", "DELETE", String.Empty);
    Console.WriteLine(s3);

    // PUT /All/tom HTTP/1.1
    var s4 = client.UploadString("http://localhost:81/User/tom", "PUT", String.Empty);
    Console.WriteLine(s4);

    Console.WriteLine("Press any key to exit...");
    Console.ReadKey(true);
  }
}

输出:
{"Age":21,"Name":"tom"}
{"Age":12,"Name":"tom"}
"DELETE..."
"UPDATE..."

WebServiceHost 继承自 ServiceHost,能自动创建所需服务端点(Endpoint、WebHttpBinding)等细节。当然,我们依旧可以使用原有的 WCF client proxy 来调用上面的服务。

var factory = new WebChannelFactory<IMyService>(new Uri("http://localhost:81"));
var proxy = factory.CreateChannel();
using (proxy as IDisposable)
{
  Console.WriteLine(proxy.CreateUser("zhangsan", "23").Name);
  Console.WriteLine(proxy.DeleteUser("lisi"));
}

或许我们会觉得为一个资源创建四个方法显得很繁琐,那么我们可以按下面的方式进行,只不过对 WCF client proxy 就有些麻烦了。

[ServiceContract]
public interface IMyService
{
  [OperationContract]
  [WebInvoke(UriTemplate = "/User/*", Method = "*", ResponseFormat = WebMessageFormat.Json)]
  string User();
}

public class MyService : IMyService
{
  public string User()
  {
    var request = WebOperationContext.Current.IncomingRequest;

    var method = request.Method;
    var args = request.UriTemplateMatch.WildcardPathSegments;

    switch (method)
    {
      case "POST":
        return "POST...";
      case "DELETE":
        return "DELETE...";
      case "PUT":
        return "UPDATE...";
      default:
        return "GET...";
    }
  }
}

WebOperationContext 提供了大量的方法,可以获取所有的请求细节,也可以对返回信息进行设置。

VS2008 提供了 AJAX-enabled WCF Service,我们只需在服务上面添加一个 [WebGet] 即可实现 IIS-Host RESTful WCF Service。

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
  // Add [WebGet] attribute to use HTTP GET
  [OperationContract]
  [WebGet(ResponseFormat = WebMessageFormat.Xml)]
  public string Hello(string name)
  {
    return "hello " + name;
  }
}

在浏览器中输入 "http://localhost:1178/Service1.svc/Hello?name=abcxxxxx" 就可以看到调用结果。

有几点需要注意:

1. 缺省情况下,我们无法使用 UriTemplate,必须把配置文件中 "enableWebScript" 注释掉。

<behavior name="Test.WCF.Service1AspNetAjaxBehavior">
  <!--<enableWebScript />-->
</behavior>

2. 必须在 .svc 中添加 "WebServiceHostFactory"。

Hello.svc

<%@ ServiceHost Language="C#" Debug="true" Service="Test.WCF.Service1" CodeBehind="Service1.svc.cs" Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

我们改造一下,使其能支持 GET/POST 和 UriTemplate。

[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
  [OperationContract]
  [WebInvoke(Method = "*", UriTemplate = "Hello/{name}", ResponseFormat = WebMessageFormat.Xml)]
  public string Hello(string name)
  {
    return "hello " + name;
  }
}

OK,除了可以在浏览器输入 "http://localhost:1178/Service1.svc/Hello/abcooooox" 调用外,我们还可以用下面的代码执行 POST 动作。

client.UploadString("http://localhost:1178/Service1.svc/Hello/xxyyzz", "POST", String.Empty);

时间: 2024-11-01 14:33:24

[转自雨痕]RESTful WCF的相关文章

jQuery调用RESTful WCF示例代码

 本篇文章主要介绍了jQuery调用RESTful WCF示例代码(GET方法/POST方法),需要的朋友可以过来参考下,希望对大家有所帮助 不废话了,直奔主题吧   wcf端:   近几年比较流行restful,为了能让ajax调用,同时也为了支持restful风格的uri,在创建一个Ajax-enabled Wcf Service后,必须手动修改svc文件,指定Factory,即:   <%@ ServiceHost Language="C#" Debug="tru

如何创建一个RESTful WCF Service

原创地址:http://www.cnblogs.com/jfzhu/p/4044813.html 转载请注明出处   (一)web.config文件 要创建REST WCF Service,endpoint binding需要用webHttpBinding,参见<webHttpBinding.basicHttpBinding和wsHttpBinding的区别>. web.config <?xml version="1.0"?> <configuration

jQuery调用RESTful WCF示例(GET方法/POST方法)

不废话了,直奔主题吧 wcf端: 近几年比较流行restful,为了能让ajax调用,同时也为了支持restful风格的uri,在创建一个Ajax-enabled Wcf Service后,必须手动修改svc文件,指定Factory,即: <%@ ServiceHost Language="C#" Debug="true" Service="ajaxSample.HelloWorld" CodeBehind="HelloWorld

jQuery调用RESTful WCF示例代码(GET方法/POST方法)_jquery

不废话了,直奔主题吧 wcf端: 近几年比较流行restful,为了能让ajax调用,同时也为了支持restful风格的uri,在创建一个Ajax-enabled Wcf Service后,必须手动修改svc文件,指定Factory,即: <%@ ServiceHost Language="C#" Debug="true" Service="ajaxSample.HelloWorld" CodeBehind="HelloWorld

[转自雨痕]LINQ to SQL - Delay Loaded

原文: http://www.rainsts.net/article.asp?id=550   对 ORM 而言,延迟加载(也叫 Lazy Loading)是必须的,毕竟当我们只是获取用户基本信息时,总不能动不动就返回大段的用户个人简介不是. 在 VS 2008 O/R Designer 中,很容易找到 Delay Loaded 的设置. 只是当我在自动生成的代码中找寻这个设置时,着实迷糊了半天.基于惯性思维,我查看了几乎所有的特性(Attribute)声明,却一无所获,最后才发觉这个家伙竟然是

如何访问restful wcf service 获取对象集合

问题描述 有个wcfservice,通过添加WebGet,可以通过http://order.svc/getorder?orderid=123这样的方式访问了.interface[WebGet(UriTemplate="GetOrder?orderId={orderId}")]IEnumerable<Order>GetOrder(intorderId);我一直都是通过添加servicereference,然后using(varclient=newOrderServiceCli

ExtJs学习笔记(20)-利用ExtJs的Ajax与服务端WCF交互

ExtJs是一套非常不错的javascript UI库(第一次接触ExtJs的,可到官方网站http://www.extjs.com/deploy/dev/examples/samples.html看下示例.相信不少人会心动的),不仅组件丰富,效果漂亮,而且ExtJs集成的Ajax功能可以方便的与.Net的WCF进行交互. 这里我们将演示ExtJs的FormPanel从WCF加载数据,以及如何提交数据到WCF服务端 1.首先来定义一个用于传输信息的Class(实际开发中,可以是Linq to S

java 利用JAX-RS快速开发RESTful 服务

JAX-RS(Java API for RESTful Web Services)同样也是JSR的一部分,详细规范定义见 https://jcp.org/en/jsr/detail?id=311 .从JAVA EE 6开始,已经内置了该技术,跟.NET中的RESTful WCF类似,只要在常规方法上使用一些简单的注解,就可以对外暴露成RESTful 服务. 注:本文运行环境为Jboss EAP 6.x ,其它容器特别是tomcat,并未自带JAX-RS依赖的jar包,如果采用tomcat,需要自

WCF Testing Tool(转)

原文:http://jayce.clearviewtickets.info/wcftestingtool.html best video: wcf testing tool   IIS7 Admin Pack Offers Built In Performance Analysis Reports Are you web developer building high traffic web site? Are you performance engineer that lives and br