在 前面几篇文章中,分别就WCF如何与Ajax交互,如何返回json数据给Ajax,如何为ExtJs控件提供数据,如何用Http的访问方式异步调用 Restful的WCF服务,本文着重讲述如何用Restful方式调用WCFl进行文件的上传和下载。在前面的文章中,曾经写过Restful的WCF 支持两种格式的请求和响应的数据格式:1)XML 2) JSON。事实上WCF不光支持上述两种格式,它还支持原生数据(Raw,来源于Carlos' blog)。 这样一来,WCF的Restful方式实际上支持任意一种格式的,因为原生的即表明可以是任意一种格式,WCF从客户端到服务端,从服务端到客户端都会保 持这种数据的原来的数据格式。通过查阅MSDN中WebMessageEncodingBindingElement 类的说明:也能找到上述的论证
首 先总结一下如何在Restful的WCF的服务端和客户端传递原生的数据(Raw),在WCF中,返回值或者参数为System.IO.Stream或者 System.IO.Stream的派生类型的时候,加配上HTTP请求和Restful服务操作响应消息中的ContentType,便能实现原生数据 的传输。
下面通过一个上传和下载图片文件的项目示例来演示如上的结论。
第一步:在VS2008中,创建一个解决方案:WcfBinaryRestful,包括四个项目:如下图所示:
| 项目名称 | 说明 |
| WcfBinaryRestful.Contracts | WCF服务的契约部分 |
| WcfBinaryRestful.Service | WCF服务具体实现部分 |
| WcfBinaryRestful.Host | WCF服务的Console程序的承载程序 |
| WcfBinaryRestful.Client | 客户端 |
第二步:在WcfBinaryRestful.Contracts中创建并设计服务契约IService.cs,代码如下:
其中ReadImg方法用于提供jpg图片文件,供客户端下载,而ReceiveImg用于接收客户端上传的jpg图片
第三步:在WcfBinaryRestful.Service项目中创建并设计服务具体实现类:Service.cs
第四步:用配置的方式,创建服务承载项目:WcfBinaryRestful.Host。并使得服务可以用Restful方式访问。
Host.cs
App.config
第五步:实现客户端程序
Form1.cs
设置好多启动项目调试后,调试,出现如下的运行界面:
1.服务承载程序运行界面图:
2.客户端运行界面图:
点击开始下载按钮,选择一个下载文件的保存位置,等待一会后,会提示下载成功,如下图所示:
打开刚才选择下载文件的保存位置,便能发现已经成功下载了jpg的图片文件:
当然顺便还可以温习一下如何异步调用Restful的WCF服务,点击取消下载可以停止下载,不再多说
点击开始上传,选择一个要上传的jpg图片,等待几秒钟,便能收到上传成功的对话框,如下图所示:
找到服务承载程序所在目录,便能看到上传的jpg图像文件: