最近一直在做基于 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 上找到。