这几天,光忙着写程序员职场了,对wse的翻译和学习没有太大的进展,这可不太好,毕竟咱还是靠技术混饭吃的,荒废了技术怎么行!今天再上一盘有关wse的小菜,目的是想用wse实现大数据的传输。
jillzhang jillzhang@126.com
这几天,光忙着写程序员职场了,对wse的翻译和学习没有太大的进展,这可不太好,毕竟咱还是靠技术混饭吃的,荒废了技术怎么行!今天再上一盘有关wse的小菜,目的是想用wse实现大数据的传输。
在wse框架结构中,能够使用Message Transmission Optimization Mechanism (MTOM) 协议来传输大数据,这在前文的翻译中也有提到,详细内容可以参见WSE 3.0 文档翻译:WSE的新功能 中的介绍。本文就是对用MTOM传输大数据做一个项目示例,主要解决用web service上传,下载文件的问题。
实现本示例,需要三步:
1) 创建asp.net xml web服务项目,并对其进行配置编码
2) 创建一个web服务的客户端应用程序,对其进行配置编码
3) 准备好测试文件,运行客户端程序,查看运行结果
-
创建asp.net xml web服务项目,并对其进行配置编码
通过项目模板,创建一个传统的asp.net xml web service网站工程,在解决方案资源管理中右键点击该工程,选择wse 3.0 settting,进行如下图所示的操作
此操作可以为项目添加对Microsoft.Web.Services3的引用,为项目能使用wse 3.0框架做出第一步设置
添加引用之后,我们需要设置网络服务能够使用MTOM协议来进行消息传输,方法如下图所示,仍通过点击wse 3.0 settting,然后进行如下的配置
这里我们可以将Server Mode设置为always或者optional,二者的区别如下:
Optional(可选的): 不管经Wse处理的请求消息是否经过MTOM编码,Soap响应或者Soap错误都是经过MTOM编码的
Always(总是):经wse处理的请求和响应一定要是MTOM编码的
经过这个操作,会在web.config中增加如下的配置信息:
在Service.asmx中添加代码
Service端
using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.IO;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public Service () {
}
[WebMethod]
public byte[] Send(string fileName) {
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
if (!File.Exists(filePath))
{
throw new Exception(string.Format("文件:{0}不存在",filePath));
}
byte[] buffer = File.ReadAllBytes(filePath);
return buffer;
}
[WebMethod]
public bool Receive(byte[] buffer,string fileName)
{
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
File.WriteAllBytes(filePath, buffer);
return false;
}
}
-
创建一个web服务的客户端应用程序,对其进行配置编码
创建一个console程序,名为BinaryMTOMClient,也按1中所示添加Microsoft.Web.Services3的引用,然后设置MTOM选项,如下图所示:
将Client Mode设置为On表示客户端允许将Soap消息进行MTOM编码。此操作会在app.config中增加如下配置信息:
添加对上面1中创建的网络服务的web引用,然后将Programe代码更改如下:
Client端
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace BinaryMTOMClient
{
public class Program:WseBase.AppBase
{
localhost.ServiceWse serviceProxy;
public Program()
{
serviceProxy = new BinaryMTOMClient.localhost.ServiceWse();
ConfigureProxy(serviceProxy);
}
static void Main(string[] args)
{
Program p = new Program();
string fileName = "1.txt";
p.Download(fileName);
fileName = "2.txt";
p.Upload(fileName);
Console.Read();
}
public void Download(string fileName)
{
try
{
Console.WriteLine("开始调用网络服务:"+serviceProxy.Url);
byte[] buffer = serviceProxy.Send(fileName);
Console.WriteLine("接收到未加密的数据");
Console.WriteLine("数据长度为:"+buffer.Length.ToString());
File.WriteAllBytes(fileName, buffer);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public void Upload(string fileName)
{
try
{
string filePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, fileName);
if (!File.Exists(filePath))
{
Console.WriteLine(string.Format("文件:{0}不存在", filePath));
return;
}
Console.WriteLine("开始调用网络服务:" + serviceProxy.Url);
byte[] buffer = File.ReadAllBytes(filePath);
serviceProxy.Receive(buffer, fileName);
Console.WriteLine("发送未加密的数据");
Console.WriteLine("数据长度为:" + buffer.Length.ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
-
准备好测试文件,运行客户端程序,查看运行结果
在网络服务的根目录中,添加1.txt作为客户端要下载的文件资源,在客户端运行目录中添加2.txt,作为客户端要上传的文件资源,按下图所示,运行客户端:
浏览网络服务根目录,新增了文件2.txt,而客户端运行目录,新增了文件1.txt,表示示例成功
-
示例项目:示例文件