|
楼主 |
发表于 2006-4-21 09:53
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
<P>本来想找些容易入门的资料,结果却发现了这个,好文!学习中。</P>
<P>前一段时间做Office开发,用到了Biztalk和Infopath...<BR>如前文( <a href="http://hbifts.cnblogs.com/hbifts/archive/2005/04/13/137116.html" target="_blank" >在Biztalk中使用Log功能:)</A> ) 所提到的,Biztalk直是太强大了...<BR>而且,后面和别人的聊天中得知,Biztalk的强大在于他可以很方便的把各种异构的环境进行统一,整合.<BR>这对于企业的开发特别重要...谁都不想自己以前的投资一下就没了(打水漂了,完全重来)...<BR>只是可惜,Biztalk的版本才是2004,即刚刚出来只有一年的时间,按M$的习惯,相关的文档是少之又少.....学习的难度比较高...<BR><BR>在使用Biztalk开发的时候,一般情况下面,它是直接可以把Hws等服务发布成WebService.那么调用就直接可以通过ASP.NET或是WinForm调用Web Service使用了...<BR><BR>不过,M$在Office2003中加入了一个新的产品-Infopath. 想必很多人都知道这个东西的...(但是,真正用过的,又有多少呢?.呵呵)<BR><BR>Infopath的表单,本质上就是一个XML文档,使用特定的XSLT进行显示,通过JScript进行交互...通过Infopath内置的功能,可以很轻松的实现WebService的调用(这个是Infopath最大的优点之一).同时,由于这个特性,Infopath在一些场合下面完全可以代替ASP.NET页面.<BR>Infopath开发方便,直接调用WS,不用像ASP.NET一样写过多的代码.直接的结果就是开发成本降低(你不用去理会什么ViewState之类了的),同时也能减少开发周期(直接拖控件,直接就可以和数据源进行绑定)...<BR><BR><BR>现在说几个Infopath开发的Cookie:<BR><BR>1.手动调用设计时加入的WebService.<BR> 在使用Infopath设计器时,我们是可以直接加入WebService的引用的(通过 工具->辅助数据源 进行添加),在添加后,我们可以选中文档打开时调用...但是,一般情况下面,我们大都不会把所有的WebService在文档打开的时间进行调用的.所以我们需要一种在其它的时候调用WebService的方法:<BR><BR>对于每加入的一个数据源,都会在 XDocument.DataObjects 中增加一个Object.通过此Object的Query()函数,我们就可以手动调用WebService了.<BR>比如调用GetTaskInfo 这个WebService:<BR></P>
<DIV windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top>XDocument.DataObjects.Item('GetTaskInfo').Query()</DIV></DIV><BR>当然了,我们可能得给这个WebService传参数,或得到其返回值..<BR>为了操作,我们先加入WebService的引用(如上面的GetTaskInfo),然后提取表单文件.提取后的文件里面,我们可以找到GetTaskInfo.xml GetTaskInfo1.xsd等文件.这里的GetTaskInfo.xml就是我们调用此WebService时传递的Soap的xml结构.打开这个文件,我们可以看到如下的结构:<BR>
<DIV windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top><dfs:myFields xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:ns7="http://microsoft.com/Biztalk2004/Hws/Hwsservice"><dfs:queryFields><ns7:GetTaskInfo><ns7:taskID></ns7:taskID></ns7:GetTaskInfo></dfs:queryFields><dfs:dataFields><ns7:GetTaskInfoResponse><ns7:Task></ns7:Task></ns7:GetTaskInfoResponse></dfs:dataFields></dfs:myFields><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top></DIV></DIV>其中,<dfs:queryFields/>中的<ns7:GetTaskInfo><ns7:taskID/></ns7:GetTaskInfo>就是此WebService的参数.<BR><dfs:dataFields>中的就是返回值了.<BR>即,我们只要在调用WebService前把这个文件中的<dfs:queryFields>填入参数,调用后从<dfs:dataFields>取回返回值就OK了...<BR>Come on. Let's go!<BR>代码:<BR>
<DIV windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> var oAuxDom = XDocument.GetDOM('GetTaskInfo');<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> oAuxDom.setProperty("SelectionNamespaces", 'xmlns:dfs="http://schemas.microsoft.com/office/infopath/2003/dataFormSolution" xmlns:ns7="http://microsoft.com/Biztalk2004/Hws/Hwsservice');<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> oAuxDom.selectSingleNode("/dfs:myFields/dfs:queryFields/ns7:GetTaskInfo/ns7:taskID").text=taskID;<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> XDocument.DataObjects.Item('GetTaskInfo').Query();<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> var propertyNode;<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> var returnTask = oAuxDom.selectNodes("/dfs:myFields/dfs:dataFields/ns7:GetTaskInfoResponse/ns7:Task");</DIV></DIV><BR>returnTask就是此WebService的返回值了...此WebService的调用就Over了~<BR><BR>2.动态修改WebService的调用地址:<BR> 在Infopath设计的过程中,我们可以直接添加WebService的地址.非常方便.但是在布署的时候会有问题.因为布署时的WebService安装的机器是不确定的.如果WebService的地址每改一次就要重设计一次Infopath,那不是太麻烦了:(<BR>这里,我们还是得用到XDocument.DataObjects这个对象了~<BR>同上面的,我们把提取表单文件.关闭Infopath,用Notepad打开mainifest.xsf文件.<BR>我们可以在里面找到类似这样的代码:<BR>
<DIV windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> <xsf:dataObjects><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> <xsf:dataObject name="GetTaskInfo" schema="GetTaskInfo.xsd" initOnLoad="no"><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> <xsf:query><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> <xsf:webServiceAdapter wsdlUrl="http://localhost/HwsService/HwsService.asmx?WSDL" queryAllowed="yes" submitAllowed="no"><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> <xsf:operation name="GetTaskInfo" soapAction="http://microsoft.com/Biztalk2004/Hws/Hwsservice/GetTaskInfo" serviceUrl="http://localhost/HwsService/HwsService.asmx"><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> <xsf:input source="GetTaskInfo.xml"></xsf:input><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> </xsf:operation><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> </xsf:webServiceAdapter><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> </xsf:query><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> </xsf:dataObject><BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> <IMG src="http://hbifts.cnblogs.com/Images/dot.gif">.<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> </xsf:dataObjects></DIV></DIV>看到了没有,这就是一个DataObjects,里面有一个名叫GetTaskInfo的DataObject,是不是和上面的那个GetTaskInfo的DataObject很像?都有一个Query?<BR>嗯.这个就是上面的那个XDocument.DataObjects.Item("GetTaskInfo")对象...既然这样,都是XMLNode.那么就有办法可以修改WebService的地址了:)<BR>示例代码:<BR>
<DIV windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> var wsObj = XDocument.DataObjects.Item('GetTaskInfo');<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> var url = "you new ws address.";<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> var objOperation = new ActiveXObject("MSXML.DOMdocument");<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> objOperation.async = false;<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> objOperation.validateOnParse = false;<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> objOperation.loadXML(wsObj.QueryAdapter.Operation);<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> objOperation.selectSingleNode("//xsf:operation/@serviceUrl").text = url;<BR><IMG src="http://hbifts.cnblogs.com/Images/OutliningIndicators/None.gif" align=top> object.QueryAdapter.Operation = objOperation.xml;</DIV></DIV>这样,我们只要在调用Query()函数前先调用这个语句,就可以动态修改WebService的地址了~<BR><BR>呵呵,不要问我怎么得到那个Url啊...简单啊,在最前面放一个TextBox,让用户自己去填.或是直接使用JScript访问注册表,从注册表中得到Url(可以试试,我没试过).<BR> |
|