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