本文共 3274 字,大约阅读时间需要 10 分钟。
作者:朱金灿
来源:blog.csdn.net/clever101
最近做一个项目,需要使用Web Service。首先简要介绍一下Web Service(对此我也是初学者)。据微软的人介绍:Web Service能够用于任何地方、任何时候和任何设备上(感觉有点吹牛),能够在一个分布式的计算环境中动态地描述、发现和调用服务,是一种Web上的对象访问技术。这种定义有点学术意味,我用我对它的粗浅的理解来描述:从开发的角度来看,它其实是一种远程调用,这和登陆网站比较类似,比如你登陆google网站,在那个对话框中输入“牛顿”来搜索牛顿的相关信息,而对Web Service而言,就是你使用A机子,在你的客户端程序中定义一个变量string Name = “牛顿”,然后输入远程服务器的URL和搜索函数名Search(), 再CALL(URL, Search, Name),这样远程服务器就把搜索结果以xml结构的方式发给你的客户端程序,是不是有点神奇?这种调用可以显式的,也可以是隐藏的。对开发人员来说这种调用的好处是因为Web Service是基于组件的,这意味着可以跨语言平台,而且处理结果是以xml结构发回来,也大大方便了对结果的解释。
使用Web Service需要先安装IIS 5.0(XP上安装IIS 5.0,Server 2003上安装IIS 6.0,如果你使用VS 2005,同时你先安装VS 2005后安装IIS5.0,那么你需要运行一个注册命令把IIS5.0通知给VS2005,因为IIS 5.0是基于.Net 1.0,而VS 2005配置的是.Net 2.0)。
现在我们开始测试一下,具体做法是使用VS 2005建立一个Web Service,使用VC++ 6.0建立一个客户端的桌面程序,使用VS 2005建立一个Web Service,然后使用这个桌面程序调用这个Web Service。
使用VS 2005建立一个Web Service的步骤:
“新建”——〉“网站”——〉
模板选择“ASP.NET WEB服务”,位置选择“HTTP”,,语言选择“Visual C#”,如下图:
添加一个WEB方法(实际上就是被远程调用的那个函数,实现两个字符串相加,输出结果字符串):
- [WebMethod]
- public string StringsAdd(string strLeft,int strRight)
- {
- return strLeft + strRight;
- }
然后单击菜单上的“生成解决方案”,按F5调试运行,页面如下:
- #import "msxml4.dll"
- using namespace MSXML2;
- #import "C:/Program Files/Common Files/MSSoap/Binaries/MSSOAP1.dll" /
- exclude("IStream", "IErrorInfo", "ISequentialStream", "_LARGE_INTEGER", /
- "_ULARGE_INTEGER", "tagSTATSTG", "_FILETIME")
- using namespace MSSOAPLib;
-
同时定义对话框类三个成员变量:
- ISoapSerializerPtr Serializer;
- ISoapReaderPtr Reader;
- ISoapConnectorPtr Connector;
2. 在按钮消息命令函数加入如下代码:
- void CCallWebMethodDlg::OnBtnCallweb()
- {
-
- CoInitialize(NULL);
-
-
- Connector.CreateInstance(__uuidof(HttpConnector));
-
- Connector->Property["EndPointURL"] = "http://localhost/MyWeb/Service.asmx?op=StringsAdd";
- Connector->Connect();
-
-
- Connector->Property["SoapAction"] = "http://tempuri.org/StringsAdd";
- Connector->BeginMessage();
-
-
- Serializer.CreateInstance(__uuidof(SoapSerializer));
-
- Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
-
-
- Serializer->startEnvelope("","","");
- Serializer->startBody("");
-
- Serializer->startElement("StringsAdd","http://tempuri.org/","","");
-
- Serializer->startElement("strLeft","http://tempuri.org/","","");
-
- Serializer->writeString("Hello,");
- Serializer->endElement();
-
- Serializer->startElement("strRight","http://tempuri.org/","","");
-
- Serializer->writeString("World!");
- Serializer->endElement();
- Serializer->endElement();
- Serializer->endBody();
- Serializer->endEnvelope();
-
-
- Connector->EndMessage();
-
- Reader.CreateInstance(__uuidof(SoapReader));
-
- Reader->Load(_variant_t((IUnknown*)Connector->OutputStream), "");
-
- AfxMessageBox((const char *)Reader->Body->xml);
- }
其中SoapAction 参数值可以通过以下方式获取:
在加?wsdl然后按回车,如下图所示:
程序运行结果如下图,可以看到“Hello,World!”的输出:
如果你想单纯输出Hello,World!,可以在函数后面添加下面代码:
- CString result1;
- result1 = (const char *)Reader->RPCResult->text;
- AfxMessageBox(result1);