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 ...
随机推荐
- Codeforces 839E Mother of Dragons【__builtin_popcount()的使用】
E. Mother of Dragons time limit per test:2 seconds memory limit per test:256 megabytes input:standar ...
- c语言函数实参与形参整理
- kali中的webshell
webacoo -g 生成一句话 -o 输出文件 -r 不混淆代码 -t 连接模式 -u 制定URL 生成一句话 webacoo -g -o a.php 连接一句话 webacoo -t -u htt ...
- flume1.8 Sinks类型介绍(三)
1. Flume Sinks 1.1 HDFS Sink 该sink把events写进Hadoop分布式文件系统(HDFS).它目前支持创建文本和序列文件.它支持在两种文件类型压缩.文件可以基于数据的 ...
- js函数声明的三种方式
1.直接声明 function box(num1,num2){ return num1+num2;}alert(box(1,2)); 2.使用变量初始化 var box2 = function(num ...
- [学习OpenCV攻略][007][缩小图片]
cvPryDown(输入图片,输出图片) 根据输出图片的大小,把输入图片进行压缩 cvPryUp(输入图片,输出图片) 根据输出图片的大小,把输入图片进行放大 #include "cv.h& ...
- 如何开发由Create-React-App 引导的应用(二)
此文章是翻译How to develop apps bootstrapped with Create React App 官方文档 系列文章 如何开发由Create-React-App 引导的应用 如 ...
- memcached集群和一致性哈希算法
场景 由于memcached集群各节点之间都是独立的,互不通信,集群的负载均衡是基于客户端来实现的,因此需要客户端用户设计实现负载均衡算法. 取模算法 N个节点,从0->N-1编号,key对N ...
- 学习Lucene、solr之前应当了解的一些术语
一些简单易理解术语,例如:词条搜索.语义信息.搜索引擎 搜索引擎分类:全文搜索(百度.谷歌).目录搜索.元搜索.垂直搜索 元搜索例子:360综合搜索.搜魅网(someta 集合了百度.google.搜 ...
- api接口token验证
接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程: 3.有点接口需要用户登录 ...