最近工作中学习使用了WCF REST,REST 有很多好处 高效 简约 面向资源 而客户端调用 也变得非常简单。REST 入门的资料等 大家可以去网上找 这里主要分享下遇到的问题以及解决~
一.环境准备
使用WCF REST 可以先下载一个模版 并大致预览
下载好这个模版后 新建项目 选择这个模版 会默认帮我们生成一个 CRUD 的代码 新手朋友可以用这个快速熟悉下REST风格的WCF.
这这里还给我们提供了一个很方便的功能 help 只需在我们的服务后面 加上help 就能显示服务的详情与介绍了
二.搭建REST WCF服务
1.接口的实现
当我们的请求为 Get时 一般用来获取数据时 使用[WebGet] 而 增加 修改 删除 则使用[WebInvoke] 里面的Method 来决定使用POST 或PUT等 这里要注意下
Method 里的一定要为大写 POST PUT等 否则会出现 HTTP 错误 405 405 不允许此方法 对于请求所标识的资源,不允许使用请求行中所指定的方法。
我们在这里 还可以通过 ResponseFormat 与 RequestFormat 来指定接受的参数与返回的参数格式
2.类继承接口 这里先贴一部分 最基础的CRUD
3. Global 里注册路由
用过mvc的朋友 是不是发现这样写完后 非常的像mvc呢~
三.实现调用服务
1.实现get 服务
很简单 我们可以直接通过浏览器 输入 http://localhost:55914/ITaskService/Tasks/State/1 即可获得state为1的所有数据 以json格式传输过来
rest 风格的wcf 使得我们不用再像以前一样 客户端 添加 服务引用了 没有了wsdl 简洁了许多 效率也提高了很多 使得我们访问更容易
REST 由于没有了代理 而是发送请求 我们的客户端可以是 js 访问 如果是 jquery 只需$.get 即可发送请求 这里我主要说下C#的访问方式
通过WebClient 方式 这个类封装的比较好 调用起来简单 但由于封装的过多 实现一些功能时则不太容易
通过WebRequest方式 这个则比较灵活
上面两个是经常用到的两个类 这里再推荐给大家一个 是wcf工具里的其中一个 专门用来访问 rest 服务 也非常的简单
通过HttpClient 这个也是微软开发的工具类 而且在最新的 .net 4.5里 集成了进去
通过上面三个任意其中一个就可以实现提交了
但是 这里有一个问题 我们以前有代理类 通过调用方法 得到代理类 可是现在呢 我们没有类 我们得到的是一串json 格式的数据 我们怎么把他变成像类一样的 方便操作呢?
比如 A公司发布了rest wcf服务 数据格式 json 公司B 要调用A公司的服务 以前ws 或wcf都有代理 可以生成代理类 现在却得到的是json数据 而我们还没有要反序列化的实体类
比如 我现在想把得到的数据 像表格一样的展示出来
有两种方法
1.对照json数据 客户端新建个类 然后通过反序列化 把json 反序列化为类对象
这样比较麻烦 类少还可以 要是多了 则需要新建很多实体类 更关键的是 服务端的实体类 更新了 以前WCF或ws 更新下服务即可 而现在 还要更新客户端实体类岂不是很麻烦?
所以推荐用下面的方法
2.将json 反序列话为 dynamic 类型
json 转换为dynamic 类型 起初 我用的是 第三方的 json.net 经过尝试 发现再把json 转换为集合类型时 总是出错 如果有朋友知道怎么弄 还望告知下
后来经过尝试 我采用了 微软自带的 JavaScriptSerializer 下面展示代码
使用方法很简单 经过 不论是序列化 集合 还是单个的 都没有问题 这个时间也会正常显示 没有问题~ 结果上面的代码 就可以把接受的json 类型 展示为一个 table了
好了 这个问题解决了 可以上三种方式发送get请求了 这个毕竟简单 大家直接看代码
可以看到 第一个 和第三个 都是非常简单的 这里要注意的是 要注意编码问题 因为传递的有中文 会有乱码问题
所以要注意编码问题 再第二个里 可以通过得到response.ContentType 先得到编码 这样就可以自动识别编码格式了
再说下HttpClient 这个真正发送请求 是在 message.EnsureStatusIsSuccessful(); 这句话
通过上面任意一种方法 我们都可以得到json 这样再通过将json 反序列话为 dynamic 类型 就可以像有实体类一样简单的操作了~~
今天先写到这
下面讲post 等提交数据 以及 原生流文件的上传 下载 等
最后 祝大家周末愉快 欢迎一起交流技术
参考:
http://blog.csdn.net/fangxinggood/article/details/6235662
原文:
http://www.cnblogs.com/wlflovenet/archive/2011/10/28/WCFREST.html