使用 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下载


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

        [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 工程

使用 WCF 实现 RESTful 方式的 WebService_第1张图片

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)