使用 WCF 实现 RESTful 方式的 WebService
来源:互联网 发布:淘宝的全球购可信吗 编辑:程序博客网 时间:2024/04/29 00:02
最近一直在做基于 BIM 的云计算相关的事情。很多渠道得知 Autodesk 自己早在两年前已经开始内部进行战略调整,全面拥抱云计算。作为 Autodesk BIM 产品的追随者,自然需要紧跟老大的步伐。
云计算的概念太大,尤其是面向建筑行业这种几乎涉及社会生活所有方面的领域,我的切入点是基于 BIM 模型的运营维保。其中一个很重要的功能就是通过手机向服务器发送多媒体数据。目前流行的技术方案是在服务器端采用 RESTful 方式实现 WebService,之后移动端自行组织 HTTP 数据包向 RESTful 接口发送。
WCF 是微软力推的通讯框架,它能够以 ASP.NET WebService 的方式实现 RESTful 方式的服务。但是缺陷是目前的版本不支持对 HTTP multipart 格式的自动解析。而不像传统的 ASP.NET WebService 可以自动解析 multipart 中的多媒体数据,并通过 Context.Request.Form["name"] 和 Context.Request.Files["name"] 方便地访问。
在网上搜索了不少其他人的代码,发现 HttpMultipartFormDataParser 是比较好的。可以解析由任意数量的多媒体文件和文本信息组成的 HTTP 包。唯一的缺陷是处理中文时出现乱码。因为作者是老外,不需要处理非罗马字符。
经过一些调试,在这份代码的基础上解决了中文乱码的问题。现在和大家分享一下,希望给和我一样被这个问题困扰,但是又希望将通讯模型统一到 WCF 框架的朋友一些帮助。
代码下载
CSDN下载
代码使用很简单,贴一段我的测试代码如下:
[WebInvoke(UriTemplate = "Upload", Method = "POST", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat=WebMessageFormat.Xml)] public string Upload(Stream dataStream) {MultipartParser parser = new MultipartParser(mDataStream);foreach (KeyValuePair<string, ParameterPart> kvp in parser.Parameters){Debug.WriteLine("Name: {0} - Value: {1}", kvp.Key, kvp.Value.Data); }foreach (FilePart filePart in parser.Files){Debug.WriteLine("Name: {0} - ContentType: {1}; FileName: {2}", filePart.Name, filePart.ContentType, filePart.FileName);using (FileStream fs = new FileStream(targetFile, FileMode.Create)){filePart.Data.CopyTo(fs);}} }
如何基于 WCF 创建 RESTful WebService
1. 在 VS2010 中安装 WCF REST Service 模板
2. 在 VS2010 中选择 WCF REST Service Application 模板创建 WebService 工程
3. 在 WebService 项目的 Web.config 中添加如下配置(重要!!!)
<bindings> <webHttpBinding> <!-- Because we need mobile client to post media file (image/audio/video), we have to configure Streamed transfer mode. On the other hand, let's assume media file won't larger than 1MB. --> <binding transferMode="Streamed" maxReceivedMessageSize="1048576"/> </webHttpBinding> </bindings>这段绑定相关的配置应该放在 <system.serviceModel> 节点中,与 <standardEndpoints> 相同层级。
- 配置首先将 WebService 设置为使用流模式(默认是缓冲模式),与之前例子代码中方法 Upload 的参数 (Stream dataStream) 相对应。否则是无法接收到数据的。
- 然后将绑定的可接收数据增加到 1MB(默认只有 64 KB)。当然这个数据可以根据你的需要调整。
其实除了关于中文的处理之外,其它的细节都可以在 GitHub 上找到。
- 使用 WCF 实现 RESTful 方式的 WebService
- 我对 WCF RESTful 身份验证的实现方式
- 实现请求url或者restful webservice的方式
- WCF RESTful 方式的大数据量限制
- WCF实现RESTFul Web Service(三):RESTful WebService VS SOAP WebService
- webservice之restful架构方式实现
- 通过WCF开发RESTful webService
- WCF的使用方式
- 使用java实现Restful webservice(Jersey)
- 将wcf 以webservice的方式调用
- 使用Rails restful方式的Session实现登陆机制
- Jersey 极致简单的Restful WebService实现
- webservice之REST以及RESTful的实现
- play 中的 restful webservice的实现
- 使用Jersey开发RESTful的webservice服务
- 使用 jersey构建RESTful的WebService
- 使用Jersey创建RESTful风格的WebService
- RestFul WebService的创建和使用实例
- 写一些忠言逆耳
- 缓存
- java架构搭建(三)--测试模块编写
- Android系统Recovery工作原理之使用update.zip升级过程分析(六)---Recovery服务流程细节
- windows8中的数据上下文和ListView的简单介绍
- 使用 WCF 实现 RESTful 方式的 WebService
- 让PHP更快的提供文件下载
- android GridView android:stretchMode="columnWidth"
- jsp页面下载txt文件
- android rndis
- 比较CreateThread,_beginthread与AfxbeginThread
- 指向结构变量的指针
- pd生成带注释的sql脚本
- 关于eclipse下tomcat部署应用时提示J2EE版本不支持问题