WCF4.0 + Restful +VS2010 图文重点笔记

WCF Restful 重点笔记


以下文章是我自已写的笔记,主要是翻译网络上的文章,并自已加以重点整理后的产物。以供我日后参考使用,如有错误请见谅~

我尽可能用图文的方式来介绍WCF REST,必竟,看图还是比较Restful一点,是吧。呵~

WCF Restful 重点笔记

本文将介绍以下主题:

1. VS2010 Rest 范本

2. 网络服务的根目录

3. 路由设定

4. WebGet/WebInvoke

5. 使用fiddler测试你的网络服务

6. UriTemplate的变化

7. Help页及Description Attribute

8. 智能选择回传格式或由客户端决定回传格式

9. 错误处理机制

10. 回传缓存设定

1. VS2010 REST 范本

一图解千言,VS2010默认并没有 REST的范本,你必须自行下载。范本的下载方式如下图所示:

1. 打开Vs2010,在主菜单工具扩充管理员:

clip_image002

2. 选择下图所示:

clip_image004

3. 安装好之后,新增项目时会看到下图,多了个叫WCF REST Service Application范本:

clip_image006

2. 网络服务的根目录

新增范本项目后,在方案总管点击项目,按右键选【属性】,看到如下画面

clip_image008

你可以在这里设定指定的通讯端口及虚拟路径

在方案选在浏览器检视

clip_image010

浏览器会到看默认的输出是一个xml数据,如下图所示,注意此时url上的根目录多了port及/Task了

clip_image012

3. 路由设定

1. 打开项目里面的Global.asax.cs档,此时会看到如下程序:

clip_image014

2. 上述程序代表现在根目录(第一个参数””)对应给Service1(第三个参数)类处理

3. 你可以根据你的需要修改上述对应关系。假设你现在修改成如下所示:

4. clip_image016

5. 那么你执行http://localhost:24929/Task/将出现如下所示,而不是数据了

clip_image018

6. 如果你执行http://localhost:24929/Task/User,则因为路由设定,会进到Service1类,因此才会出现xml

clip_image020

4. WebGet/WebInvoke

1. 打开Service1.cs档,你会看到有一些方法,这些方法上面都定义了一些Attribute

2. WebGet代表对应到Http:Get的要求,而WebInvoke则对应到Http的Post, Delete, Put要求,这是REST的精神所在,透过Http的,Get, Put, Post, Delete来对应资源的查,改,增,删

clip_image022

5. 使用fiddler测试你的网络服务

浏览器可以很简单的送出Http:Get的要求,但其他的要求就不行了,此时你要透过Fiddler这个软件来进行测试,Fiddler是自由软件,你可以在Google搜寻一下就可以找到。

接下来试范如何透过Fiddler来进行Post的测式

1. 打开Service1.cs,修改Get()回传一个SampleItem数据,如下所示;并在Get()及Update()方法中设定中断点

clip_image024

2. 执行项目,并浏览器拷贝要测试的url, 例如http://localhost:24929/Task/User/1,此时会进入到Get方法中。

3. 将浏览器画面上的Xml拷贝起来,等一下会用到

clip_image026

4. 打开Fiddler,将Url贴到 Request Builder页上,将localhost为ipv4.fiddler, 并将GET改成PUT如下图所示

5. clip_image028

6.

7. 在Request Body,贴上刚刚copy的数据

8. clip_image030

9. 在Request Headers,加入Content-Type:text/xml,如下图所示

clip_image032

10. 按Execute按钮,此时就会发现进入到PUT()方法中,此时可以检查传进来的参数,会是我刚刚在fiddler上的设定一样

6. UriTemplate的变化

UriTemplate可以很多样化。我们可以设定自已的UriTemplate来决定对应方法的参数,如下图所示

[WebGet(UriTemplate = "Tasks?skip={skip}&top={top}&owner={userName}")]

用中括号括起来,代表是对应到类里面方法的参数

7. Help页及Description Attribute

WCF4.0会自已产生出Help页,只要在根目录下加一个/help,就可以开启help说明页,如下图所示

clip_image034

想要自订义描述说明,只要在你要描述的方法加入以下Attirbute 即可,如下所示:

[Description("Returns the tasks that are owned by the team.")]

8. 智能选择回传格式或由客户端决定回传格式

WPF4自已会跟据要求来选择回传的格式

1. 首先打开Fiddler,如下图括起来的设定

clip_image036

2. 按下Execute后,点击左侧的WebSession,然后点右下方的RAW页签,你会发现回传的值变成JSON格式了

clip_image038

3. 如果要由客户端自行决定回传格式,那么就要在方法的UriTemplate设定,例如下图所示

4. clip_image040

5. 接下来在程序中用以下的方式来设定回传的格式,下例会剖析format参数是否为json格式

clip_image042

9. 错误处理机制

在REST,当发生错误时,建议使用标准的HTTP来应用错误的消息。

错误有二种

l 参数类型不对,例如只接受整数的参数,而传来字符串,此时回传Http status code :400(Bad Request)

l 参数对,但没有数据,则回传404(Not fond)

第一种错误,是丢出以下异常

throw new WebFaultException( string.Format( "The value '{0}' is not a valid task id. The id must be an integer.",  id), HttpStatusCode.BadRequest);

第二种错误,是丢出以下异常

throw new WebFaultException( string.Format("There is no task with the id '{0}'.", parsedId), HttpStatusCode.NotFound); 

10. 回传的缓存设定

针对很少被异动的数据,我们可以打开缓存来加快服务的响应速度,特别注意,如果该服务是用来进行授权或认证的,缓存一定要关闭,否则会造成安全上的漏洞

只要在方法上面加上AspCatchProfile属性,并给一个缓存名称,如下所示

[AspNetCacheProfile("UsersCollection")]

1. 打开Web.Config,找到元素,此时应该长这样…


    
  

2. 在System.web下面加入caching元素如下所示


    
    
      
      
        
        

      

    

  

3. 在 内加入以下设定


                  varyByParam="skip; top; manager" varyByHeader="Accept"/>
  

4. Duration的单位是秒,所以60是一分钟。varyByParam="skip; top; manager"表示参数不一样,就视为不同的要求,因此用不同的缓存保存。同样的varyByHeader="Accept"代表不同的http:accept值也代表不同的缓存。