??xml version="1.0" encoding="utf-8" standalone="yes"?>
发布|站有多UŞ式,比较传统的方式是使用FTPQ或者用Windowsq程桌面之类的,各个aspx和dll复制到对应的服务器目录中厅R这样做的缺Ҏ而易见,是不够方便Q另外很隑ց到只上传更新q的文g?br />
强大的Visual Studio提供了直接的|站发布的功能,其实准确说ƈ不是Visual Studio提供的,而是通过了微软提供的一套工PWeb Deployment ToolQ这套工具在你安装Visual Studio的时候也p动安装了Qƈ且跟Visual Studio很好地整合了hQ当Ӟ光是你自己开发用的电脑上装了q是不行的,服务器也得装Q反正我用的Windows Server 2003服务器上默认是没有的。这个工L介绍及下载地址见:
http://technet.microsoft.com/en-us/library/dd569059(WS.10).aspx
然后……
我就h一下,详情直接自己看MSDNQ后面我只针对可能出现的问题讲讲Q?br />
http://msdn.microsoft.com/zh-cn/library/dd465337.aspx
在你“Publish Web”的时候,会出现这个对话框Q注意那?#8220;Site/application”的选项Q?br />
“/lm/w3svc/1/ROOT/app1”Q这是我的写法,啥意思呢Q?#8220;lm”大概是Local machineQ网站发布位|跟前面指定的服务器一_“w3svc”是IIS服务了,“1”是Site IDQ这里的“1”指的应该是默认|站Q?#8220;ROOT”q里指的是默认网站的根目录;最后的“app1”是我徏的虚拟目录了。如果是别的情况Q请上MSDN查查看。这D讲解其实连我自己都不是很确定,q个选项很晦涩,又很关键Q写错了发布不成功?br />
后面的User name/Passworld自然得要有管理员权限了?br />
如果q里你成功了Q你会很快发C个问题,那就是web.configq个文gQ服务器的配|一般跟本地调试的配|是不同的,你发布的时候是直接把本地的q个文g上传到服务器了,肯定是不对的了,怎么改?
其实你如果是用向导创建工E的话,你就会发现web.configq个节点打开的话下面有两个文Ӟ如图Q?br />
如果没有Q你也可以右击web.configQ然后在弹出的菜单中选择“Add Config Transforms”Q?#8220;Web.Debug.Config”是用来在发布Debug版的|站的时候,用来对web.config做一些修改的Q?#8220;Web.Release.Config”是用来在发布Release|站的时候,用来对web.config做一些修改的Q如果你有更多的配置文gQ这U?#8220;Config Transforms”会有更多个?br />
你打开Web.Debug.Config看看Q其实上面都已经有注释教你如何来写这个文件的了,只不q如果你需要更详细的信息的话,׃够,你得参看q个链接Q?br />
http://msdn.microsoft.com/zh-cn/library/dd465326.aspx
要全部学会里面的内容Q一来很难,二来没必要,我们做项目,不是在做U研Q感觉就是掌握原理,然后见招拆招Q有需要再打开参考吧?br />
希望本文能帮上你些忙?br />
Windows Mobile没落?#8230;…我不止一ơ提赯话,我甚x疑我现在开发的Windows MobileE序是不是最后一个获得较多用LWindows MobileE序Q也许弄完了q个之后Q也没什么h再会涉q个领域了?/p>
OKQ废话不说了Q言归正传,Webservice最最最典型的应用是什么?——更新天气Q你看看Webservice的入门文章,都是拿天气更C例,而我做的q个正好也是一个天气更斎ͼ接口是我定义的,具体׃贴出来了Q总而言之我们要从WSDLq个接口文g出发Q假设你已经有了q个WSDL文g了,文g名ؓ“SSPWeatherService.asmx”。(不懂WSDL的话先了解下WebserviceQ?/p>
接着要去获取一份gSOAP的代码,地址是gsoap2.sourceforge.netQ我下蝲的版本是2.8.3Q这?011q?月更新的Q在q前我下载了2.8.2Q这两个版本用v来还有些微小的差别,哪个更好Q当然是新的更好了?/p>
下蝲完之后当然是解压~,我是把它解压~到“D:\gsoap”q个路径下。然后给pȝ环境变量“path”增加q么一个\径:“D:\gsoap\gsoap\bin\win32\”Q这完全是ؓ了一会儿方便调用?#8220;wsdl2h.exe”?#8220;soapcpp2.exe”Q否则你q得输入exe的完整\径?/p>
刚才那个WSDL文g“SSPWeatherService.asmx”攑ֈ你的工作目录下,比如“D:\work\SSPWeatherUpdate_WS”Q然后用命令行工具Q如下执行:
其中涉及C个命令:
>wsdl2h SSPWeatherService.asmx -o SSPWeatherService.h
>soapcpp2 SSPWeatherService.h -ID:\gsoap\gsoap\import -C -x -i
W一个命令是ҎWSDL文g生成相应的头文gQ用-o参数指定生成的头文g的名U?br />W二个命令死Ҏ刚生成的头文件来生成别的头文件和cpp文g?I后面是gSOAP的import目录的\径,q个是必ȝQ?C表示只生成客L代码Q这正是我们需要的Q?x可以生成一些垃圾,-i表示生成C++装代码Q用C++装好的代码比纯C代码好用多了?/p>
接下来你查看目录中的文g可能是这P
soapC.cpp
soapH.h
soapSSPWeatherServiceSoapProxy.cpp
soapSSPWeatherServiceSoapProxy.h
soapStub.h
SSPWeatherService.asmx
SSPWeatherService.h
SSPWeatherServiceSoap.nsmap
也就是说Q除了asmx和第一步生成的h文g之外Q之后生成的文g有这些:
soapC.cpp
soapH.h
soapSSPWeatherServiceSoapProxy.cpp
soapSSPWeatherServiceSoapProxy.h
soapStub.h
SSPWeatherServiceSoap.nsmap
可能你还会碰C面这几个文gQ这跟你原本的asmx的接口定义有关系Q?br />soapSSPWeatherServiceSoap12Proxy.cpp
soapSSPWeatherServiceSoap12Proxy.h
SSPWeatherServiceSoap12.nsmap
“12”表示soap?.2版本Q你比较一下,发现q几个文件跟上面提到的几个文件的内容是几乎一致的Q除了里面的名称大多都加上了“12”Q对我来说这几个文g是不需要的Q所以删除掉了?/p>
接下d然是用Visual Studio创徏一个工E来使用刚才生成的这些文件了。我创徏的Project名称?#8220;SSPWeatherUpdate_WS”Q目录也是刚才的那个目录Qؓ了简单v见,创徏一个consolecd的程序用来测试就行了?/p>
然后把刚才生成的q些文gd到这个Project中去Q?br />soapC.cpp
soapH.h
soapSSPWeatherServiceSoapProxy.cpp
soapSSPWeatherServiceSoapProxy.h
soapStub.h
SSPWeatherService.h
也许你注意到了,asmx和nsmap文g是不需要添加的?/p>
然后是很关键的一部,把D:\gsoap\gsoap目录下的stdsoap2.h和stdsoap2.cpp复制到刚创徏的工E目录ƈd到工E中厅R完了之后Project里应该有q些东西Q?br />
~译一下看看,能不能通过。可能出C一大堆的错误,可能你会看到q样的出错提C:
“1>.\soapC.cpp(16) : warning C4627: '#include "soapH.h"': skipped when looking for precompiled header use”
q是因ؓ工程讄了?#8220;预编译头”Q我们不要用预~译_工程属性设|如下图Q?br />
讄后rebuildQ看看还有没有什么问题?在我q里出现了这L错误提示Q?br />1>.\soapC.cpp(850) : error C3861: 'soap_outdateTime': identifier not found
1>.\soapC.cpp(855) : error C3861: 'soap_indateTime': identifier not found
表面上看是漏掉某个头文gQ或者某个编译选项不正引P但其实,q正是让我郁闷了好久Q努力了好久Q最后才发现无解的问题,其中波折׃惛_q里赘述了,如果你认己技术水q不错,可以直接摆^q个问题的话不妨试一下看Q但如果旉不是很多的话我劝你就了Q直接采Uxq个l论QgSOAP在WM环境下不支持WSDL中的datetimecdQ我不知道这不bugQ可能准说“支持不佳”Q如果前面的asmx是你定义的话Q你改一改,把其中的datetimecd改ؓstringQ然后自己在E序中再作{换,如果asmx不是你定义的话,那就很不q怺Q我也没辙了Q修改gSOAP的代码是很痛苦的工作Q我费了很大力气最后都没解冻I如果你有能力解决Q不妨跟我分享一下?/p>
我直接脓上我的完整代码,希望能够抛砖引玉?/p>
使用Webservice的过E中Q我通过查找“闵行”来找到我的城市,再根据城市ID来获取天气,其实代码q不多,多在字符~码转换和Debug输出q部分,因ؓ我们的XML使用UTF-8~码Q而我们的软g界面通常使用Unicode~码Q所以得转换Q英文的情况下不转换是没什么问题的Q但汉字一定得转,否则是q了?/p>
另外特别注意q个地方Q?br /> SSPWeatherServiceSoapProxy gs(SOAP_C_UTFSTRING);
gs.soap_endpoint = "SOAP_C_UTFSTRINGQ这个是用来指定UTF-8~码的,一定不能少Q下面这个soap_endpoint参数则用来指明这个Webservice的服务地址?/p>
1Q超?/strong>
E序发布之后有h反映不能使用QWindows Mobile如果用电脑直q的话就没Q何问题,但如果用GPRS上网的话q真的可能出现失败的情况Q我认ؓq是因ؓGPRS速度太慢Q用h感觉q不如以?6K猫拨号上|)D时的缘故。可以通过下面办法来解冻I
pGS.accept_timeout = 30;
pGS.connect_timeout = 30;
pGS.recv_timeout = 30;
pGS.send_timeout = 30;
pGS.linger_time = 30;
2Q无法用WAP方式更新
许多人用手机上网的时候都喜欢用WAP方式Q就是那U用代理服务器的方式Q移动的接入点叫cmwapQ联通的叫uniwapQ代理的地址?#8220;10.0.0.172”。由于连接用了代理,gSOAP也得昄指定一个代理,Ҏ如下Q?br />pGS->proxy_host = “10.0.0.172”;
pGS->proxy_port = 80;
可能不一定是“10.0.0.172”Q端口也可能不是80Q这两个信息可以通过q接理器相关的API来获得,具体׃展开了,提示一下,用这个:ConnMgrProviderMessage?/p>
我不知道q有什么疑难杂症,q篇文章也无法囊括所有内容,大家只能见招拆招了?br />