vc++调用web服务传输文件
bool webService::UploadFile(LPWSTR appKey, LPWSTR fileName, const int len, unsigned char * buff)
{ try
{
//SoapSerializer用于序列化(串行化),创建,封装SOAP消息.用来构建一个向Web服务发送的SOAP消息
ISoapSerializerPtr Serializer;
//SoapReader将SOAP消息解析为一个DOM模型,并提供一系列操作该DOM模型的方法
ISoapReaderPtr Reader;
//SoapConnector在对象之间发送和接收SOAP消息的传输协议
ISoapConnectorPtr Connector; IDataEncoderFactoryPtr encoderFc; //创建一个Connector对象
Connector.CreateInstance(__uuidof(HttpConnector30));
//Web服务是由Property(HttpConnector的一个属性)指定的
//在处理这一属性时有件事情需要指定:我们引用的哪个属性以及该属性的值
//EndPointURL属性指定Web服务
Connector->Property["EndPointURL"] = "http://127.0.0.1/Services/UploadService.asmx?wsdl";//web服务的URL
////////////////////////////////////////////////////////////////////////////
//Connector->Property[参数]说明,对大小写敏感
// AuthPassword: 端点认证用的口令。
// AuthUser: 端点认证用的用户名
// EndPointURL : 端点的URL
// ProxyPassword: 代理认证的口令
// ProxyPort : 代理服务器使用的端口
// ProxyServer : 代理服务器的IP地址或主机名
// ProxyUser : 代理认证的用户名
// SoapAction: HTTP头部中SoapAction中的值。这个属性只使用于低级API。它将忽略SoapClient接口(高级API)中的ConnectorProperty属性 。
// SSLClientCertificateName:指定使用Secure Sockets Layer (SSL)加密协议(如果存在,则该字符串标明用于SSL协议中的客户端证书)。语法如下:
// [CURRENT_USER | LOCAL_MACHINE\[store-name\]]cert-name with the defaults being CURRENT_USER\MY (与Microsoft Internet Explorer用法相同)。
// Timeout: HttpConnector的超时限制,以毫秒为单位。
// UseProxy: 一个类型为布尔型的属性,表明是否使用代理服务器。缺省情况下,这一属性的值被设定为False,表明无需使用代理服务器。如果要使用代服务器,需要将该属性的值设置为True。如果将该属性的值设置为True, 而又没有设置ProxyServer属性,HttpConnector将使用IE中设置的代理服器。HttpConnector会忽略IE中的“不使用代理服务器”设置。
// UseSSL: 表明是否使用了SSL的布尔型值。如果该属性被设置为True,则无论WSDL中是否指定了HTTP或HTTPS,HttpConnector对象都使用SSL连接。
// 如果该属性的值被设置为False,则只有在WSDL中指定了HTTPS的情况下, HttpConnector对象才会使用SSL连接
// 详细请参考:http://www.codesky.net/article/200504/62841.html
/////////////////////////////////////////////////////////////////////////// Connector->Connect();
//开始消息
Connector->Property["SoapAction"] = "http://tempuri.org/Append";
//开始SOAP消息
//在完成与Web服务的连接和其他的细节后,我们就可以调用向服务器发送SOAP信息的方法了,必须在调用SoapSerializer的其他方法之前调用该方法
Connector->BeginMessage();
//创建SoapSerializer对象
Serializer.CreateInstance(__uuidof(SoapSerializer30));
//将serializer连接到connector的输入字符串
//在与服务器连接前,SoapSerializer对象必须与SoapConnector对象连接。
//为了使这二个对象相互连接,我们需要调用SoapSerializer对象的Init方法,该方法需要一个参数InputStream(向服务器发送数据的流)
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
//创建SOAP消息
//开始处理SOAP消息,
//第一个参数是命名空间,缺省为SOAP-ENV,第二个参数定义URL,第三个参数定义Serialzier->startBody("")函数的编码方式。
Serializer->StartEnvelope("","","");
//开始处理Body元素,参数为URI的编码类型,缺省为NONE
Serializer->StartBody("");
//开始处理Body里的子元素
//第一个参数是元素名,第二个参数是URL,第三个参数是编码类型,第四个参数是元素的命名空间
///////////Serializer->StartElement("HelloWorld", "http://localhost:42782/","","soap");
Serializer->StartElement("Append", "http://tempuri.org/","","soap");
//WebXml.com.cn是Web服务所属的名称空间(如果Web服务提供者没有指定名称空间,将会使用该默认名称空间)。
///////// Serializer->StartElement("theCityName","","","soap");
//写入元素值,
////////// Serializer->WriteString("郑州");
//上面的每个startXXX函数后都要有相应的endXXX函数来结尾
/////// Serializer->EndElement();
//密钥(自定义web服务中的参数)
Serializer->StartElement("appKey","","","soap");
Serializer->WriteString(appKey);
Serializer->EndElement(); //文件名称(自定义web服务中的参数)
Serializer->StartElement("fileName","","","soap");
Serializer->WriteString(fileName);
Serializer->EndElement(); /********************传输二进制数据*****************************/
HRESULT hr = FALSE;
encoderFc.CreateInstance(__uuidof(DataEncoderFactory30));
DWORD *len1=new DWORD;
IDataEncoderPtr encoder=encoderFc->GetDataEncoder(L"base64");
encoder->raw_SizeToEncode(buff,len,len1);
int lon = *len1;
byte *data = new byte[lon+];
hr=encoder->Encode(buff,len,data,len1);
if(FAILED(hr)){
TRACE("Encode error! ");
}
int len2 = *len1; Serializer->StartElement("buffer","","","soap");
Serializer->WriteBuffer(len2, (byte*)data);
delete len1;
delete[] data; //结束 Serializer->EndElement();
/********************结束传输二进制数据*****************************/
Serializer->EndElement();
Serializer->EndBody();
Serializer->EndEnvelope();
//消息做完之后,连接器就调用endMessage()方法将消息发送到服务器
Connector->EndMessage();
//创建响应soap消息
Reader.CreateInstance(__uuidof(SoapReader30));
//OutPutStream来读取SoapReader对象中的信息
//将reader连接到connector的输出字符串
Reader->Load(_variant_t((IUnknown*)Connector->OutputStream),"");
//将回应信息加载到SoapReader对象后,就可以用它的RpcResult属性来获取结果,
//但是RpcResult并不直接返回结果,它返回Body的第一个实体元素
//然后用text属性读取该元素的属性值
return ((const char*)Reader->RpcResult->text)=="true"; /* printf("%s\n",(const char*)Reader->RpcResult->text);
MessageBoxA(NULL, Reader->RpcResult->text, "提示", MB_OK);*/
}
catch(_com_error &e)
{
printf("%s",e.ErrorMessage());
} return ;
}
2、web服务接口:
/// <summary>
/// 上传文件到服务器
/// </summary>
/// <param name="fileName"></param>
/// <param name="buffer"></param>
/// <returns></returns>
[WebMethod]
public bool Append(string fileName, string buffer,string appKey)
{ bool isAppend = true;
try
{
fileName = Path.Combine(@"d:\"+ Path.GetFileName(fileName) + ".txt");
if (!File.Exists(fileName))
{
CreateFile(fileName,appKey);
}
byte[] fileBuff = Convert.FromBase64String(buffer); FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
fs.Seek(, SeekOrigin.End);
fs.Write(fileBuff, , fileBuff.Length);
fs.Close();
}
catch(Exception e)
{
string text = e.Message;
isAppend = false;
}
return isAppend;
}
注意需要使用到:SoapToolkit3.0 开发包,开发的时候需要安装到本地,发布的时候不安装该客户端的步骤:
1、修改头部文件:
#import "msxml4.dll" named_guids //FOR SOAPTIOOLKIT 3.0
#import "MSSOAP30.dll" named_guids \
exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", \
"_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
2、将该目录下的所有文件复制到程序运行目录下“C:\Program Files (x86)\Common Files\MSSoap\Binaries\”,另外还需要复制msxml4r.dll msxml4.dll 两个文件。注意这两个文件创建时间都是2002-2-4其它时间的我这里报错
3、然后再注册相关文件:
最后在程序目录下执行:
regsvr32 "MSSOAP30.dll"
regsvr32 "Resources\1033\MSSOAPR3.dll"
regsvr32 "WISC30.dll"
regsvr32 "msxml4.dll"
参考:https://www.1wanweb.com/post/vc2b2b60-mfc-soapsdke5bc80e58f91websesrvicee68993e58c85.aspx
vc++调用web服务传输文件的更多相关文章
- Android调用Web服务
现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了.本文总结如何在android中调用Web服务,通过传递基 ...
- mvc路由引起异步调用web服务的问题
从一篇blog得知使用脚本可以异步调用Web服务,觉得很新鲜,因为自己很少用到Web服务,所以决定写一写看看什么效果. 首先在UI项目(我使用的是MVC4.0)里创建一个Web服务. 添加Web服务后 ...
- Linux基础学习-使用vsftpd服务传输文件
使用vsftpd服务传输文件 1 安装vsftpd [root@qdlinux ~]# yum install vsftpd Loaded plugins: product-id, search-di ...
- Nginx作为静态资源web服务之文件读取
Nginx作为静态资源web服务之文件读取 文件读取会使用到以下几个配置 1. sendfile 使用nginx作为静态资源服务时,通过配置sendfile可以有效提高文件读取效率,设置为on表示启动 ...
- python起的 simpleHTTPServer服务传输文件
python起的 simpleHTTPServer服务传输文件 经同事的介绍,在Linux上传输文件的一种特别方便的方法: python -m SimpleHTTPServer [端口] 端口不填 默 ...
- 动态调用web服务
通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...
- 使用ASP.NET AJAX 从脚本中调用Web 服务的应用方法
技能点:通过编写WebService,在页面js中调用WebService来进行数据查询. 网站开发,有些时候需要使用js在页面动态生成一些内容,但还有些数据要通过查询数据库才能获取的. 但由于诸如主 ...
- 在 SQL Server 的存储过程中调用 Web 服务
介绍 一个老朋友计划开发一个应用,基于 .NET 和 Socket,但需要在存储过程中调用 Web 服务. 在这篇文章中我们将分享这个应用的经验,讲述如何在存储过程中调用 Web 服务,并传递参数. ...
- 动态调用web服务 --WSHelper.cs
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Net;us ...
随机推荐
- 微信小程序--合法域名校验出错
第一次做小demo的时候遇到一个问题,合法域名校验出错: 第一步:登陆微信公众号平台--个人中心--设置--开发设置--服务器域名(一个月只有5次修改机会一定要珍惜) 第二步 打开微信开发者工具,有个 ...
- atom编辑器启动后文件不能编辑的解决办法
今天更新了atom,并且安装了很多插件,突然发现所有页面不能编辑了,如图 这个光标块会自动跳到单词后面,后来发现按一下键盘的字母a就变成正常光标了,至于原因,折腾了一个小时也没发现,后来百度到用Ctr ...
- ThinkPHP3.2中英文切换!
小伙伴们好久不见!!! 最近公司项目版本升级,小梦已经忙成了狗,无暇顾及文章,今天抽时间写一篇助助兴! 用Thinkphp这个国产框架已经2年多了,现在有一个小功能:网站中英文切换功能,当然这 ...
- MongoDB入门学习笔记之简介与安装配置
一.MongoDB简介 1.文档数据库 MongoDB是一款开源的文档型非关系数据库,具有高性能.高可靠性和自动扩展等特点.MongoDB中的每一条记录是一个文档,其数据存储结构为键/值对,类似JSO ...
- 使用python写一个简单的C段扫
纠结C段查询N久..刚刚拿骚棒FD去抓御剑的包,发现emmm...申请了必应的Key 然后去拿必应API查.这里疼[心]原本也想去弄的.但是人懒. 然后就没有然后了. 代码: 生成IP段的脚本图1 # ...
- Java集合源码分析(三)Vevtor和Stack
前言 前面写了一篇关于的是LinkedList的除了它的数据结构稍微有一点复杂之外,其他的都很好理解的.这一篇讲的可能大家在开发中很少去用到.但是有的时候也可能是会用到的! 注意在学习这一篇之前,需要 ...
- 2017ecjtu-summer training #4 CodeForces 731C
C. Socks time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...
- POJ 1426 Find The Multiple(数论——中国同余定理)
题目链接: http://poj.org/problem?id=1426 Description Given a positive integer n, write a program to find ...
- TCP协议中三次握手
TCP/IP是互联网相关的各类协议族的总称 TCP/IP协议族分为:应用层,传输层,网络层,数据链路层 应用层:向用户提供应用服务时的通讯的活动 传输层:提供处于网络连接中的两台计算机之间的数据传输 ...
- Spark算子--partitionBy
转载请标明出处http://www.cnblogs.com/haozhengfei/p/923b11fce561e82748baa016bcfb8421.html partitionBy--Trans ...