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服务传输文件的更多相关文章

  1. Android调用Web服务

    现在大部分应用程序都把业务逻辑处理,数据调用等功能封装成了服务的形式,应用程序只需要调用这些web服务就好了,在这里就不赘述web服务的优点了.本文总结如何在android中调用Web服务,通过传递基 ...

  2. mvc路由引起异步调用web服务的问题

    从一篇blog得知使用脚本可以异步调用Web服务,觉得很新鲜,因为自己很少用到Web服务,所以决定写一写看看什么效果. 首先在UI项目(我使用的是MVC4.0)里创建一个Web服务. 添加Web服务后 ...

  3. Linux基础学习-使用vsftpd服务传输文件

    使用vsftpd服务传输文件 1 安装vsftpd [root@qdlinux ~]# yum install vsftpd Loaded plugins: product-id, search-di ...

  4. Nginx作为静态资源web服务之文件读取

    Nginx作为静态资源web服务之文件读取 文件读取会使用到以下几个配置 1. sendfile 使用nginx作为静态资源服务时,通过配置sendfile可以有效提高文件读取效率,设置为on表示启动 ...

  5. python起的 simpleHTTPServer服务传输文件

    python起的 simpleHTTPServer服务传输文件 经同事的介绍,在Linux上传输文件的一种特别方便的方法: python -m SimpleHTTPServer [端口] 端口不填 默 ...

  6. 动态调用web服务

    通常我们在程序中需要调用WebService时,都是通过“添加Web引用”,让VS.NET环境来为我们生成服务代理,然后调用对应的Web服务.这样是使工作简单了,但是却和提供Web服务的URL.方法名 ...

  7. 使用ASP.NET AJAX 从脚本中调用Web 服务的应用方法

    技能点:通过编写WebService,在页面js中调用WebService来进行数据查询. 网站开发,有些时候需要使用js在页面动态生成一些内容,但还有些数据要通过查询数据库才能获取的. 但由于诸如主 ...

  8. 在 SQL Server 的存储过程中调用 Web 服务

    介绍 一个老朋友计划开发一个应用,基于 .NET 和 Socket,但需要在存储过程中调用 Web 服务. 在这篇文章中我们将分享这个应用的经验,讲述如何在存储过程中调用 Web 服务,并传递参数. ...

  9. 动态调用web服务 --WSHelper.cs

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Net;us ...

随机推荐

  1. Angular17 Angular自定义指令

    1 什么是HTML HTML文档就是一个纯文本文件,该文件包含了HTML元素.CSS样式以及JavaScript代码:HTML元素是由标签呈现,浏览器会为每个标签创建带有属性的DOM对象,浏览器通过渲 ...

  2. 新手必须掌握的Linux命令

    一.命令组成 一个完整的命令通常由  命令名称 [命令参数] [命令对象]  组成. 注意:命令名称.命令参数.命令对象之间用空格键隔开. 二.系统工作命令 查看主机名称 echo $HOSTNAME ...

  3. 大区间素数筛选(POJ 2689)

    /* *POJ 2689 Prime Distance *给出一个区间[L,U],找出区间内容.相邻的距离最近的两个素数和距离最远的两个素数 *1<=L<U<=2147483647 ...

  4. 将数据按照gzip当时解压的工具类

    import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; impo ...

  5. Unity 小笔记

    1,Time.deltatime放在Update和fixedupdate中得到的值是不一样的.还以为是通过两个值来获取. 2,VR中绘制射线可以使用LineRender. 3,Unity中判断一个东西 ...

  6. java final关键字的详解

    final可以修饰成员变量.局部变量.方法.和类 1.final修饰成员变量时,必须在定义时初始化或者在构造方法中初始化 表示该成员变量无法在该类中被更改,但是可以被继承.如果子类不再定义相同名字的成 ...

  7. navicat将多个表导出为一个sql文件

    1.shift选中多个表 2右键选择--转储sql文件---结构和数据

  8. PHP怎么获取系统信息和服务器详细信息

    https://zhidao.baidu.com/question/1435990326608475859.html 获取系统类型及版本号: php_uname() (例:Windows NT COM ...

  9. MYBATIS异常:INVALID BOUND STATEMENT

    1.mapper.xml中namespaces错误(***) 2.方法不存在 3.方法返回值错误

  10. 一个简单的div弹出层的小例子

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...