应用 WCF 实现 RESTful 方式的 WebService

使用 WCF 实现 RESTful 方式的 WebService最近一直在做基于 BIM 的云计算相关的事情。很多渠道得知 Autodes

使用 WCF 实现 RESTful 方式的 WebService

最近一直在做基于 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下载


代码使用很简单,贴一段我的测试代码如下:


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 上找到。