﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-中国龍</title><link>http://www.cnblogs.com/huqingyu/</link><description>=============龖:龍腾飞的样子=============</description><language>zh-cn</language><lastBuildDate>Thu, 21 Aug 2008 13:23:31 GMT</lastBuildDate><pubDate>Thu, 21 Aug 2008 13:23:31 GMT</pubDate><ttl>60</ttl><item><title>eclipse tableviewer 编辑功能</title><link>http://www.cnblogs.com/huqingyu/archive/2008/06/27/1230937.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Fri, 27 Jun 2008 02:09:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/06/27/1230937.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1230937.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/06/27/1230937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1230937.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1230937.html</trackback:ping><description><![CDATA[1. LabelProvider：<BR>isLableProperty要return true<BR>或者就extends jface.viewer的LabelProvider<BR><BR>2.在tableViewer上加Cell Modifier<BR>CusCellModifier cellModifier = new CusCellModifier(tableViewer);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tableViewer.setCellModifier(cellModifier);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tableViewer.setCellEditors(new CellEditor[] {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new ComboBoxCellEditor(table, new String[0]) });<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cellModifier.stickCellEditors();<BR><BR>tableViewer.setColumnProperties(getColumnProperties());<BR><BR>3.CusCellModifier<BR><BR>public class CusCellModifier<BR>&nbsp;&nbsp;&nbsp; implements ICellModifier<BR>{<BR>&nbsp;&nbsp;&nbsp; public void stickCellEditors()<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comboBoxCellEditor = (ComboBoxCellEditor)getCellEditorForProperty("AAA");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comboBoxCellEditor.setItems(getItemsForFieldCombo());<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setVisibleItemCount("AAA");<BR>&nbsp;&nbsp;&nbsp; }<BR>}<img src ="http://www.cnblogs.com/huqingyu/aggbug/1230937.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41822/" target="_blank">[新闻]第一财经周刊:当前互联网世界正处无秩序时代</a>]]></description></item><item><title>Google Code Host的使用说明</title><link>http://www.cnblogs.com/huqingyu/archive/2008/06/22/1227821.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Sun, 22 Jun 2008 15:14:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/06/22/1227821.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1227821.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/06/22/1227821.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1227821.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1227821.html</trackback:ping><description><![CDATA[摘要: Google Code Host的使用说明by shootsoftyinjun@shootsoft.nethttp://www.shootsoft.net1. Eclipse的Subversion使用说明开发工具以Eclipse为主，所以Eclipse首先需要安装一个Subversion的插件。参考下面的网址：http://www.ibm.com/developerworks/cn/opensou&nbsp;&nbsp;<a href='http://www.cnblogs.com/huqingyu/archive/2008/06/22/1227821.html'>阅读全文</a><img src ="http://www.cnblogs.com/huqingyu/aggbug/1227821.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>Ant是个好东西[转]</title><link>http://www.cnblogs.com/huqingyu/archive/2008/06/22/1227706.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Sun, 22 Jun 2008 09:55:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/06/22/1227706.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1227706.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/06/22/1227706.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1227706.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1227706.html</trackback:ping><description><![CDATA[<H1 class=headtit>在Eclipse中使用Ant来自动编译J2me程序</H1>
<H3 class=headaur><A href="http://www.builder.com.cn/" target=_blank>开发者在线 Builder.com.cn</A> 更新时间:<CITE>2007-09-23</CITE>作者：<SPAN>中国IT实验室</SPAN> 来源:中国IT实验室</H3>
<H2 class=headkeyw>本文关键词： <A href="http://www.builder.com.cn/files/list-0-0-74503-1-1.htm" target=_blank>Ant</A> <A href="http://www.builder.com.cn/files/list-0-0-67355-1-1.htm" target=_blank>编程</A> <A href="http://www.builder.com.cn/files/list-0-0-49591-1-1.htm" target=_blank>Java</A> </H2>
<DIV class=artl_con>
<DIV class=wenzhang>
<DIV class=huazhonghua><SPAN id=hua1></SPAN></DIV><BR>　　今天是比较郁闷的一天，一不小心把eclipse的一个j2me项目中的verified/classes目录中的东东删除了。之后才发现eclipse是如何惩罚我的：它再也不会在这个目录中生成class了，呵呵，罢工了我的工。<BR>　　<BR>　　为什么eclipse不是想netbeans那样用ant来编译、运行j2me项目那？？好在本人目前正在研究ant，呵呵，小试牛刀地用了2小时做了个比较完善的ant脚本可以来弥补一下eclipse对我心情的打击了。<BR>　　<BR>　　下面我把这个脚本和源程序（含demo）贡献出来，大家一起研究探讨。<BR>　　<BR>　　完成以下功能:<BR>　　1.建立基本目录框架<BR>　　2.编译src目录中的源文件<BR>　　3.调用preverify.exe对类文件进行验证<BR>　　4.将类文件生成jar包<BR>　　5.调用proguard类对jar包进行混淆，并解压缩<BR>　　6.将经过混淆、解压缩后的类、资源文件生成jar包，复制src目录中的jad文件，完成程序部署<BR>　　7.调用emulator运行程序<BR>　　<BR>　　用法：<BR>　　只需要修改一下CONF.properties文件中的属性：<BR>　　1.midp.lib.dir-WTK的lib目录路径(位于CONF.properties文件中)<BR>　　2.midp.lib.path-根据需要扩展使用的jar(位于CONF.properties文件中)<BR>　　3.programName-生成jar/jad文件的名字<BR>　　在本脚本中可修改的地方:<BR>　　preverify.exe和emulator.exe的具体参数可以根据需要修改。<BR>　　<BR>　　注意:<BR>　　1.src目录中需要有MANIFEST.MF和$.jar文件，这些将用在生成jar和部署程序时.<BR>　　2.res目录中放置使用的png图片文件.<BR>　　<BR>　　附加类库：<BR>　　混淆器类Proguard-位于lib中。<BR>　　<BR>　　文件说明:<BR>　　CONF.properties:配置属性文件<BR>　　GEN.properties:生成MANIFEST.MF和$.jad文件的替换属性文件<BR>　　JAD.tmp:生成jad文件用到的替换模板文件<BR>　　MANIFEST.tmp:生成MANIFEST.MF文件用到的替换模板文件<BR>　　<BR>　　&lt;?xml version="1.0" encoding="GBK"?&gt;<BR>　　&lt;project name="automake" default="end" basedir="."&gt;<BR>　　&lt;property file="CONF.properties"/&gt;<BR>　　&lt;property name="src.dir" value="$src"/&gt;<BR>　　&lt;property name="res.dir" value="$res"/&gt;<BR>　　&lt;property name="build.dir" value="$build"/&gt;<BR>　　&lt;property name="deploy.dir" value="$deploy"/&gt;<BR>　　&lt;property name="package.dir" value="$package"/&gt;<BR>　　&lt;property name="package.extract.dir" value="$extract"/&gt;<BR>　　&lt;property name="preverified.dir" value="$preverified"/&gt;<BR>　　&lt;property name="preverified.noObfusedClass.dir" value="$noObfusedclasses"/&gt;<BR>　　&lt;property name="preverified.obfusedClass.dir" value="$obfusedclasses"/&gt;<BR>　　&lt;property name="preverify.bin" value="$binpreverify.exe"/&gt;<BR>　　&lt;property name="emulator.bin" value="$binemulator.exe"/&gt;<BR>　　&lt;property name="proguard.lib.dir" value="$lib"/&gt;<BR>　　&lt;property name="jad.file" value="$.jad"/&gt;<BR>　　&lt;target name="init" description="初始化环境"&gt;<BR>　　&lt;echo message="初始化目录"/&gt;<BR>　　&lt;delete dir="$"/&gt;<BR>　　&lt;delete dir="$"/&gt;<BR>　　&lt;delete dir="$"/&gt;<BR>　　&lt;delete dir="$"/&gt;<BR>　　&lt;mkdir dir="$"/&gt;<BR>　　&lt;mkdir dir="$"/&gt;<BR>　　&lt;mkdir dir="$"/&gt;<BR>　　&lt;mkdir dir="$"/&gt;<BR>　　&lt;mkdir dir="$"/&gt;<BR>　　&lt;mkdir dir="$"/&gt;<BR>　　&lt;mkdir dir="$"/&gt;<BR>　　&lt;/target&gt;<BR>　　&lt;target name="complie" depends="init" description="编译"&gt;<BR>　　&lt;echo message="编译程序"/&gt;<BR>　　&lt;javac srcdir="$" destdir="$"&gt;<BR>　　&lt;bootclasspath path="$"/&gt;<BR>　　&lt;classpath&gt;<BR>　　&lt;fileset dir="$" includes="*.jar"/&gt;<BR>　　&lt;/classpath&gt;<BR>　　&lt;/javac&gt;<BR>　　&lt;/target&gt;<BR>　　&lt;target name="verifyForNoObfuscate" description="验证j2me的class，将验证后的class输出到$"&gt;<BR>　　&lt;echo message="验证生成的class，将验证后的class输出到$"/&gt;<BR>　　&lt;exec executable="$" searchpath="false"&gt;<BR>　　&lt;arg line="-classpath $"/&gt;<BR>　　&lt;arg line="-d $"/&gt;<BR>　　&lt;arg line="$"/&gt;<BR>　　&lt;/exec&gt;<BR>　　&lt;/target&gt;<BR>　　&lt;target name="genManifest" description="根据模板属性文件的值生成Manifest文件"&gt;<BR>　　&lt;echo message="根据模板属性文件的值生成Manifest文件"/&gt;<BR>　　&lt;!--<BR>　　使用$替换掉属性文件GEN.properties中的@PROGRAMNAME@<BR>　　--&gt;<BR>　　&lt;replace file="GEN.properties"<BR>　　token="@PROGRAMNAME@"<BR>　　value="$"<BR>　　/&gt;<BR>　　&lt;!--<BR>　　使用GEN.properties文件中的属性值替换掉模板文件MANIFEST.tmp中的对应属性值,<BR>　　将替换后的数据复制到$MANIFEST.MF<BR>　　--&gt;<BR>　　&lt;copy file="MANIFEST.tmp"<BR>　　tofile="$MANIFEST.MF"&gt;<BR>　　&lt;filterset begintoken="@" endtoken="@"&gt;<BR>　　&lt;filtersfile file="GEN.properties"/&gt;<BR>　　&lt;/filterset&gt;<BR>　　&lt;/copy&gt;<BR>　　&lt;/target&gt;<BR>　　&lt;target name="package" description="将class打包，输出到$"&gt;<BR>　　&lt;echo message="将class打包，输出到$"/&gt;<BR>　　&lt;jar basedir="$"<BR>　　jarfile="$$-noObfused.jar"<BR>　　manifest="$MANIFEST.MF"　　　&gt;<BR>　　&lt;fileset dir="$" includes="**/*.png"/&gt;<BR>　　&lt;/jar&gt;<BR>　　&lt;/target&gt;<BR>　　&lt;target name="obfuscate" description="对打包后的jar文件进行混淆,然后解压缩至$"&gt;　　　&lt;echo message="对打包后的jar文件进行混淆,然后解压缩至$"/&gt;<BR>　　&lt;java fork="true" classname="proguard.ProGuard"&gt;<BR>　　&lt;classpath path="$proguard.jar"/&gt;<BR>　　&lt;arg line="-libraryjars $"/&gt;<BR>　　&lt;arg line="-injar $$-noObfused.jar"/&gt;<BR>　　&lt;arg line="-outjar $$-obfused.jar"/&gt;<BR>　　&lt;!--保留MIDlet的类声明不被混淆--&gt;<BR>　　&lt;arg line="-keep 'public class * extends javax.microedition.midlet.MIDlet'"/&gt;<BR>　　&lt;!--打印被保留的类名--&gt;<BR>　　&lt;arg line="-printseeds"/&gt;<BR>　　&lt;/java&gt;<BR>　　&lt;unjar src="$$-obfused.jar"<BR>　　dest="$"　　　/&gt;<BR>　　&lt;/target&gt;<BR>　　&lt;target name="verifyForObfuscate" description="验证被混淆的class，输出到$"&gt;<BR>　　&lt;echo message="验证被混淆的class，输出到$"/&gt;　　　&lt;exec executable="$" searchpath="false"&gt;<BR>　　&lt;arg line="-classpath $"/&gt;<BR>　　&lt;arg line="-d $"/&gt;<BR>　　&lt;arg line="$"/&gt;<BR>　　&lt;/exec&gt;<BR>　　&lt;copy todir="$"&gt;<BR>　　&lt;fileset dir="$" includes="**/*.png"/&gt;<BR>　　&lt;/copy&gt;<BR>　　&lt;/target&gt;<BR>　　&lt;target name="deploy" description="将经过验证的混淆后的class打包，部署在delpoy目录"&gt;<BR>　　&lt;echo message="将经过验证的混淆后的class打包，部署在$目录"/&gt;<BR>　　&lt;jar basedir="$"<BR>　　jarfile="$$.jar"<BR>　　manifest="$MANIFEST.MF"<BR>　　&gt;<BR>　　&lt;fileset dir="$" includes="**/*.class;*.png"/&gt;<BR>　　&lt;/jar&gt;<BR>　　&lt;/target&gt;<BR>　　&lt;target name="genJad" description="在$目录生成JAD文件"&gt;<BR>　　&lt;echo message="在$目录生成JAD文件"/&gt;<BR>　　&lt;length file="$$.jar" property="jarsize"/&gt;<BR>　　&lt;echo message="获得jar文件长度:$"/&gt;<BR>　　&lt;replace file="GEN.properties"<BR>　　token="@JARSIZE@"<BR>　　value="$"<BR>　　/&gt;<BR>　　&lt;replace file="GEN.properties"<BR>　　token="@PROGRAMNAME@"<BR>　　value="$"<BR>　　/&gt;<BR>　　&lt;copy file="JAD.tmp" tofile="$$.jad"&gt;<BR>　　&lt;filterset begintoken="@" endtoken="@"&gt;<BR>　　&lt;filtersfile file="GEN.properties"/&gt;<BR>　　&lt;/filterset&gt;<BR>　　&lt;/copy&gt;<BR>　　&lt;/target&gt;</DIV></DIV><img src ="http://www.cnblogs.com/huqingyu/aggbug/1227706.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41820/" target="_blank">[新闻]Visual Studio 2008 SDK 1.1 发布</a>]]></description></item><item><title>.NET/FCL 2.0在Serialization方面的增强 </title><link>http://www.cnblogs.com/huqingyu/archive/2008/06/14/1220942.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Fri, 13 Jun 2008 23:52:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/06/14/1220942.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1220942.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/06/14/1220942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1220942.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1220942.html</trackback:ping><description><![CDATA[摘要: 1、支持绑定到非公有方法的委托关于这一点，与其说是个增强，在我看来这似乎是设计思路上略微的转变。具体地说，在.NET 1.x，像这样的代码：[Serializable]class Person...{ public event EventHandler Birthday;}static void Main(string[] args)...{ Person p = new Person(); p.&nbsp;&nbsp;<a href='http://www.cnblogs.com/huqingyu/archive/2008/06/14/1220942.html'>阅读全文</a><img src ="http://www.cnblogs.com/huqingyu/aggbug/1220942.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41821/" target="_blank">[新闻]死敌VMware变身微软认证计划新成员</a>]]></description></item><item><title>通过SOAP发送附件</title><link>http://www.cnblogs.com/huqingyu/archive/2008/06/11/1217993.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Wed, 11 Jun 2008 15:59:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/06/11/1217993.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1217993.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/06/11/1217993.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1217993.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1217993.html</trackback:ping><description><![CDATA[摘要: SendingAttachmentsWithSOAP.gif(9.9 K)clip_image001.gif(9.2 K)clip_image003.gif(16.2 K)clip_image005.gif(76.4 K)clip_image007.gif(49.1 K)切换到幻灯片模式Sending Attachments with SOAP SOAP applications often ha&nbsp;&nbsp;<a href='http://www.cnblogs.com/huqingyu/archive/2008/06/11/1217993.html'>阅读全文</a><img src ="http://www.cnblogs.com/huqingyu/aggbug/1217993.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41819/" target="_blank">[新闻]英特尔雅虎开发网络计算机频道</a>]]></description></item><item><title>DataSet在WCF中怎么办?</title><link>http://www.cnblogs.com/huqingyu/archive/2008/06/09/1216297.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Mon, 09 Jun 2008 09:47:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/06/09/1216297.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1216297.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/06/09/1216297.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1216297.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1216297.html</trackback:ping><description><![CDATA[<BLOCKQUOTE><A name=wp80419></A>
<H2 class=pTitle><A href="http://java.sun.com/webservices/reference/tutorials/wsit/doc/DataBinding.html">http://java.sun.com/webservices/reference/tutorials/wsit/doc/DataBinding.html</A></H2>
<H2 class=pTitle>Data Contracts </H2><A name=wp94343></A>
<P class=pBody>This chapter describes guidelines for&nbsp;&nbsp;: </P>
<DIV class=pSmartList1>
<UL class=pSmartList1><A name=wp94245></A>
<DIV class=pSmartList1>
<LI>Designing a XML schema exposed by a web service starting from Java</LI></DIV><A name=wp94249></A>
<DIV class=pSmartList1>
<LI>Consuming a WCF service generated WSDL/XML schema when designing a Java client or Java web service</LI></DIV><A name=wp94250></A>
<DIV class=pSmartList1>
<LI>Developing a Microsoft WCF client</LI></DIV></UL></DIV><A name=wp97851></A>
<P class=pBody>A WSIT client/service uses JAXB 2.0 for XML serialization, generating XML schemas from Java classes and generating Java classes from XML schemas. A WCF client/service uses either <CODE class=cCode>XmlSerializer</CODE> or <CODE class=cCode>DataContractSerializer</CODE> for like tasks. JAXB 2.0 and the WCF XML serialization mechanisms differ in two fundamental ways. First, JAXB 2.0 supports all of XML schema. .NET's <CODE class=cCode>DataContractSerializer</CODE> and <CODE class=cCode>XmlSerializer</CODE> support different XML schema sets. Second, WCF's <CODE class=cCode>XMLSerializer</CODE>/<CODE class=cCode>DataContractSerializer</CODE> and JAXB 2.0 differ in their mapping of programming language datatypes to XML Schema constructs. As a result, a XML schema generated from a programming language on one platform and consumed on another platform may result in less than developer-friendly bindings. This chapter discusses some of the common databinding differences between the two systems and recommends ways to address them. <BR><BR>二 论坛:<BR><A href="http://forums.java.net/jive/thread.jspa?threadID=23398">http://forums.java.net/jive/thread.jspa?threadID=23398</A><BR><BR>Summary: There are multiple threads related to DataSet in these forums. This is an area that needs some guidelines in general.<BR><BR>First, consider how a DataSet is mapped.<BR><BR></P><PRE>    [DataContract]
    <FONT color=navy><B>public</B></FONT> <FONT color=navy><B>class</B></FONT> Foo <FONT color=navy>{</FONT>
&nbsp;
        [DataMember]
        <FONT color=navy><B>public</B></FONT> DataSet ds;
     <FONT color=navy>}</FONT>
&nbsp;
</PRE>
<P class=pBody><BR><BR>will map to <BR><BR>[ code ]<BR>&lt;xs:complexType name="Foo"&gt;<BR>&lt;xs:sequence&gt;<BR>&lt;xs:element minOccurs="0" name="ds" nillable="true"&gt;<BR>&lt;xs:complexType&gt;<BR>&lt;xs:annotation&gt;<BR>&lt;xs:appinfo&gt;<BR>&lt;ActualType Name="DataSet" Namespace="http://schemas.datacontract.org/2004/07/System.Data" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" /&gt;<BR>&lt;/xs:appinfo&gt;<BR>&lt;/xs:annotation&gt;<BR>&lt;xs:sequence&gt;<BR>&lt;xs:element ref="xs:schema" /&gt;<BR>&lt;xs:any /&gt;<BR>&lt;/xs:sequence&gt;<BR>&lt;/xs:complexType&gt;<BR>&lt;/xs:element&gt;<BR>&lt;/xs:sequence&gt;<BR>&lt;/xs:complexType&gt;<BR>&lt;xs:element name="Foo" nillable="true" type="tns:Foo" /&gt;<BR><BR>[/code]<BR><BR>Notice that &lt;element ref="xs:schema"/&gt; . This will cause wsimport to fail. There is an issue already logged against this. <A href="https://jaxp.dev.java.net/issues/show_bug.cgi?id=14">https://jaxp.dev.java.net/issues/show_bug.cgi?id=14</A> . The generated schema allows the schema to be deferred until runtime ; since a DataSet can be filled at runtime, there is no way of knowing what the schema is at design time.<BR><BR>One way to avoid to this to pass a strongly typed dataset. For example,<BR><BR></P><PRE>[DataContract]
<FONT color=navy><B>public</B></FONT> <FONT color=navy><B>class</B></FONT> Foo <FONT color=navy>{</FONT>
&nbsp;
        [DataMember]
        <FONT color=navy><B>public</B></FONT>  BooksDataSet bds;
<FONT color=navy>}</FONT>
&nbsp;
<FONT color=navy><B>public</B></FONT> <FONT color=navy><B>class</B></FONT> BooksDataSet : DataSet <FONT color=navy>{</FONT>...<FONT color=navy>}</FONT>
&nbsp;
</PRE>
<P class=pBody><BR><BR>This will generate a different schema. Notice that &lt;element ref ="xs:schema"/&gt; is no longer generated. <BR><BR></P><PRE>  &lt;xs:complexType name=<FONT color=red>"Foo"</FONT>&gt;
    &lt;xs:sequence&gt;
      &lt;xs:element minOccurs=<FONT color=red>"0"</FONT> name=<FONT color=red>"bds"</FONT> nillable=<FONT color=red>"true"</FONT> type=<FONT color=red>"tns:BooksDataSet"</FONT> /&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
  &lt;xs:element name=<FONT color=red>"Foo"</FONT> nillable=<FONT color=red>"true"</FONT> type=<FONT color=red>"tns:Foo"</FONT> /&gt;
  &lt;xs:complexType name=<FONT color=red>"BooksDataSet"</FONT>&gt;
    &lt;xs:sequence&gt;
      &lt;xs:any namespace=<FONT color=red>""</FONT> /&gt;
    &lt;/xs:sequence&gt;
  &lt;/xs:complexType&gt;
  &lt;xs:element name=<FONT color=red>"BooksDataSet"</FONT> nillable=<FONT color=red>"true"</FONT> type=<FONT color=red>"tns:BooksDataSet"</FONT> /&gt;
</PRE>
<P class=pBody><BR><BR>The above should be consumable by wsimport. However, the object model is driven by the above schema. So one would get java.lang.Object for xs:any.<BR><BR>In short, DataSets work well in MS specific environment but not cross platform.<BR>Other suggestions on the forum and/or elsewhere indicate that other types could be used instead of a strongly typed DataSet - e.g. arrays, XmlNode, or XmlDataDocument.<BR><BR><BR>This is an area where we could use guidlines. Please post your feedback on this thread and I will incorporate it into a future version of the DataContracts chapter<BR>(go to <A href="http://weblogs.java.net/blog/sekhar/archive/2007/02/jaxb_and_wcf_da_2.html">http://weblogs.java.net/blog/sekhar/archive/2007/02/jaxb_and_wcf_da_2.html</A> ; follow the link to Data Contracts chapter).<BR><BR>Message was edited by: sekhar <BR><BR><BR>----------------------------------------<BR>The suggestion was not to expose DataSet to from the .NET service. Instead, map DataSet to another .NET type and expose that datatype. For e.g in your .NET service,<BR>1. Use a strongly typed dataset instead of DataSet (above example).<BR>2. Map DataSet to a jagged array ( e.g. object[][] )<BR>3. Map DataSet to a System.Xml.XmlNode . For e.g.<BR></P><PRE>    DataSet ds;
    <FONT color=darkgreen>//... fill in dataset</FONT>
    XmlNode xmlnode = <FONT color=navy><B>new</B></FONT> XmlDataDocument( ds );
   
</PRE>
<P class=pBody><BR>&nbsp;</P></BLOCKQUOTE><img src ="http://www.cnblogs.com/huqingyu/aggbug/1216297.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41818/" target="_blank">[新闻]Windows Live视频邮件9月9日开始测试</a>]]></description></item><item><title>Oracle App Client use Mtom</title><link>http://www.cnblogs.com/huqingyu/archive/2008/06/08/1216002.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Sun, 08 Jun 2008 11:22:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/06/08/1216002.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1216002.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/06/08/1216002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1216002.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1216002.html</trackback:ping><description><![CDATA[<H2>MTOM interoperability between Oracle App Server and Sun WSIT</H2>
<P mce_keep="true">A few months ago I wrote a couple of articles (<A href="http://weblogs.asp.net/gsusx/archive/2006/12/14/mtom-interoperability-between-oracle-application-server-and-windows-communication-foundation-part1-from-wcf-to-oracle.aspx">WCF-ORA</A>, <A href="http://weblogs.asp.net/gsusx/archive/2006/12/19/mtom-interoperability-between-oracle-application-server-and-windows-communication-foundation-part2-from-oracle-to-wcf.aspx">ORA-WCF</A>) about Message Transmission Optimization Mechanism (MTOM) interoperability between Oracle Application Server and Microsoft Windows Communication Foundation (WCF).&nbsp; Most of the feedback I got from those posts was related with MTOM interoperability scenarios using other Web Service technologies toolkits. Based on that, I decided to post a few more demos that reflect MTOM interoperability scenarios for different vendors. Specifically, this paper shows how to achieve MTOM interoperability between Oracle App Server and Sun Web Service Interoperability Technology (WSIT - Project Tango).&nbsp; Believe it or not, I am sorry .NET developers; there is no .NET code in this paper.</P>
<P>This post does not intend to provide a formal introduction to MTOM. Suffice to say that after a few years and three predecessors' specifications, MTOM has become the preferred Standard for SOAP-encoded binary messaging optimization. MTOM relies on the XML Optimized Processing (XOP) Standard as the serialization mechanism to represent binary data as a MIME/Multipart Related package. If you are interested in the importance of MTOM interoperability you might want to read my <A href="http://weblogs.asp.net/gsusx/archive/2006/12/14/mtom-interoperability-between-oracle-application-server-and-windows-communication-foundation-part1-from-wcf-to-oracle.aspx">previous paper</A> or this <A href="http://blogs.msdn.com/jevdemon/archive/2005/05/05/415126.aspx">post</A> by <A href="http://blogs.msdn.com/jevdemon/default.aspx">John Evdemon</A>. </P>
<P><B>Sun WSIT and MTOM</B></P>
<P>WSIT is part of Project Metro which is the Web Services stack from Sun Microsystems. Specifically, WSIT is the component of Project Metro that implements some of the most important WS-* protocols emphasizing in interoperability with Microsoft WCF. Needless to say, that WSIT also interoperates really well with other Web Services technologies including Oracle App Server. At the moment WSIT implements some of the most important WS-* protocols for areas such as Security, Reliability, Transactions and messaging optimization (a.k.a MTOM). The typical scenarios for applying MTOM are Web Services that handles binary data like <B><I>byte[]</I></B> as part of their contract. The following code illustrates a WSIT Service that can be highly optimized with the use of MTOM. </P>
<TABLE class="" cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD class="">
<P>@WebService()<BR>public class FileWS {<BR><BR>@WebMethod(action="PrintFileContents")<BR>public int PrintFileContents(byte[] buffer)<BR>{<BR>for(int i=0; i&lt;= buffer.length - 1; i++)<BR>System.out.println(buffer[i]);<BR>return buffer.length;<BR>}<BR>}</P></TD></TR></TBODY></TABLE>
<P>&nbsp;Now we need to configure the service policy in order to optimize the message exchange using MTOM.&nbsp; The trick here, in order to achieve interoperability with Oracle App Server, is to remove the default WSIT WS-Addressing settings. This is due to the fact that Oracle App Server and Sun WSIT implement different versions of WS-Addressing. The change is not required if the client side supports MTOM with WS-Addressing 1.0 like WCF does. Also, If you are using a development IDE such as NetBeans there is no need to manually configure the policy except for removing the use of WS-Addressing; instead you can the Web Service configuration editor which provides a nice interface for configuring the different WS-* protocols for a particular service. </P>
<TABLE class="" cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD class="">
<P>&lt;definitions <BR>xmlns="http://schemas.xmlsoap.org/wsdl/" <BR>xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" <BR>xmlns:xsd="http://www.w3.org/2001/XMLSchema" <BR>xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" name="FileWSService" targetNamespace="http://mtomws/" xmlns:tns="http://mtomws/" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsaws="http://www.w3.org/2005/08/addressing" xmlns:wsoma="http://schemas.xmlsoap.org/ws/2004/09/policy/optimizedmimeserialization" <BR>&gt;<BR><B><I>WSDL components....</I></B><BR>&lt;wsp:Policy wsu:Id="FileWSPortBindingPolicy"&gt;<BR>&lt;wsp:ExactlyOne&gt;<BR>&lt;wsp:All&gt;<BR><B><I>&lt;!-- &lt;wsaws:UsingAddressing xmlns:wsaws="http://www.w3.org/2006/05/addressing/wsdl"/&gt;--&gt;</I></B><B><I><BR></I></B><B><I>&lt;wsoma:OptimizedMimeSerialization/&gt;</I></B><BR>&lt;/wsp:All&gt;<BR>&lt;/wsp:ExactlyOne&gt;<BR>&lt;/wsp:Policy&gt;<BR>&lt;/definitions&gt;</P></TD></TR></TBODY></TABLE>
<P>Now we are ready to deploy the service, for the purposes of this demo we used Sun Glassfish.</P>
<P><B>Oracle App Server and MTOM</B></P>
<P>Now it's time to implement an Oracle client for the WSIT service created on the previous section. The first natural step is to generate the proxy using the Web Service Proxy Wizard included in JDeveloper or the corresponding command-line tool. In order to interface with WCF using MTOM, the client code should set the MTOM_SUPPORT property to "True" either programmatically or using the configuration file. The following code shows a sample client that interacts with the WCF service created in the previous section</P>
<TABLE class="" cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD class="">
<P>public static void Test()<BR>{<BR>try<BR>{<BR>FileTransmitter transmitter= new FileTransmitter();<BR>byte[] buffer= transmitter.GetImg("c:\\temp\\images\\p1.jpg");<BR>FileWSPortClient binding= new FileWSPortClient();<BR>FileWS proxy= binding.getPort();<BR>((OracleStub)proxy)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY, service url);<BR><B><I>((OracleStub)proxy)._setProperty(ClientConstants.MTOM_SUPPORT, true);</I></B><BR>int result= proxy.printFileContents(buffer);<BR>System.out.println(result);<BR>}<BR>catch(Exception ex)<BR>{<BR>System.out.println(ex.getMessage());<BR>}<BR>}</P></TD></TR></TBODY></TABLE>
<P><B>&nbsp;</B><B>Messages Messages</B></P>
<P>After hosting the WSIT service in Sun Glassfish and running the Oracle client the following message sequence is produced</P>
<TABLE class="" cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD class="">
<P>POST /MtomServices/FileWSService HTTP/1.1<BR>Host: localhost:8082<BR>Connection: Keep-Alive, TE<BR>TE: trailers, deflate, gzip, compress<BR>User-Agent: Oracle HTTPClient Version 10h<BR>SOAPAction: "PrintFileContents"<BR>Accept-Encoding: gzip, x-gzip, compress, x-compress<BR><B><I>Content-type: multipart/related;type="application/xop+xml";boundary="----=_Part_0_13050435.1185038715262";start="&lt;97b2fe36f9184df3a6fa8792abd9a00c&gt;";start-info="text/xml;charset=UTF-8"</I></B><B><I><BR>Content-length: 12849</I></B><BR><BR>------=_Part_0_13050435.1185038715262<BR>Content-Type: application/xop+xml;charset=UTF-8;type="text/xml;charset=UTF-8"<BR>Content-Transfer-Encoding: 8bit<BR>Content-ID: &lt;97b2fe36f9184df3a6fa8792abd9a00c&gt;<BR><BR>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<BR>&lt;env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="http://mtomws/"&gt;&lt;env:Body&gt;&lt;ns0:PrintFileContents&gt;&lt;arg0&gt;<B><I>&lt;xop:Include xmlns:xop="http://www.w3.org/2004/08/xop/include" href="cid:b9abc481c3664db8b0b7f842d0886c30"/&gt;</I></B>&lt;/arg0&gt;&lt;/ns0:PrintFileContents&gt;&lt;/env:Body&gt;&lt;/env:Envelope&gt;<BR>------=_Part_0_13050435.1185038715262<BR>Content-Type: application/octet-stream<BR>Content-Transfer-Encoding: binary<BR>Content-Id: &lt;b9abc481c3664db8b0b7f842d0886c30&gt;</P></TD></TR></TBODY></TABLE>
<P>&nbsp;<B>SOAP request produced by the Oracle client</B></P>
<TABLE class="" cellPadding=0 width="100%" border=1>
<TBODY>
<TR>
<TD class="">
<P>Content-Id: &lt;rootpart*74f72fe4-510e-48de-a29a-38896f03901d@example.jaxws.sun.com&gt;<BR><B><I>Content-Type: application/xop+xml;charset=utf-8;type="text/xml"</I></B><B><I><BR>Content-Transfer-Encoding: binary</I></B><BR><BR>&lt;?xml version="1.0" ?&gt;&lt;S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"&gt;&lt;S:Body&gt;&lt;ns2:PrintFileContentsResponse xmlns:ns2="http://mtomws/"&gt;&lt;return&gt;12000&lt;/return&gt;&lt;/ns2:PrintFileContentsResponse&gt;&lt;/S:Body&gt;&lt;/S:Envelope&gt;</P></TD></TR></TBODY></TABLE>
<P><B>SOAP response produced by the Sun WSIT service</B></P>
<P>You can notice that the byte[] in the request message its been optimized using MTOM and XOP. </P>
<P>In the next weeks I will be posting more demos about WS-* protocols interoperability between some of the top Web Services technologies in the market. </P>
<DIV class=postfoot><SPAN class=em>Published</SPAN> Friday, July 27, 2007 9:55 AM by <A href="http://weblogs.asp.net/members/gsusx.aspx">gsusx</A> 
<DIV class=em><SPAN id=ctl00_Main_ctl08_ctl01>Filed under: <A href="http://weblogs.asp.net/gsusx/archive/tags/SOA/default.aspx" rel=tag>SOA</A>, <A href="http://weblogs.asp.net/gsusx/archive/tags/Oracle/default.aspx" rel=tag>Oracle</A>, <A href="http://weblogs.asp.net/gsusx/archive/tags/Web+Services/default.aspx" rel=tag>Web Services</A>, <A href="http://weblogs.asp.net/gsusx/archive/tags/Sun+WSIT/default.aspx" rel=tag>Sun WSIT</A>, <A href="http://weblogs.asp.net/gsusx/archive/tags/J2EE/default.aspx" rel=tag>J2EE</A>, <A href="http://weblogs.asp.net/gsusx/archive/tags/Web+Services+Interoperability/default.aspx" rel=tag>Web Services Interoperability</A></SPAN></DIV></DIV><img src ="http://www.cnblogs.com/huqingyu/aggbug/1216002.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41817/" target="_blank">[新闻]Intel首次公开展示Nehalem架构迅驰3平台</a>]]></description></item><item><title>Axis2中使用WS-Addressing协议</title><link>http://www.cnblogs.com/huqingyu/archive/2008/06/08/1215897.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Sun, 08 Jun 2008 03:00:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/06/08/1215897.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1215897.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/06/08/1215897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1215897.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1215897.html</trackback:ping><description><![CDATA[&nbsp;作者：清华大学 戴凤军 
<DIV><STRONG><SPAN style="FONT-SIZE: 15pt">WS-Addressing</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 15pt">协议</SPAN></STRONG></DIV><PRE style="TEXT-INDENT: 24pt">主要包括三部分内容，一是EndpointReference定义，实际上一个定义了一个服端点的模型。二是<A href="http://www.w3.org/TR/ws-addr-core/#msgaddrprops"><SPAN style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">MAP<SPAN style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">属性</SPAN></SPAN>的定义，即消息寻址需要设定和支持的相关属性，三是协议的绑定方式，即如何将协议绑定到现有的协议实现之上如WSDL和SOAP。</A></PRE><PRE style="TEXT-INDENT: 24pt">主要用来解决以下问题：一是实现与底层传输的隔离，通过将寻址信息放在SOAP头部从而摆脱了对底层协议寻址的依赖。二是结合实现基于消息的路由，可以根据ReplyTo属性实现基于消息的路由。三是实现有状态的会话，基于MessageID和RelatesTO属性实现对会话状态保存机制，从而提供有状态的服务。</PRE><PRE style="TEXT-INDENT: 24pt">下面基于以上内容对Axis2和CXF关于WS-Addressing的实现情况进行简单的对比</PRE>
<DIV><STRONG><SPAN style="FONT-SIZE: 15pt">一、</SPAN></STRONG><STRONG><SPAN style="FONT-SIZE: 15pt">AXIS2</SPAN></STRONG></DIV>
<DIV><STRONG><SPAN style="FONT-SIZE: 15pt">支持情况：</SPAN></STRONG></DIV>
<DIV><SPAN style="FONT-SIZE: 12pt">支持的版本：submission(2004.8)和final (2005.8)两个版本。</SPAN></DIV>
<DIV>&nbsp;</DIV><PRE style="TEXT-INDENT: 24pt">EndPointReferance在Axis2里是一个核心概念，它通过EndpointReference类型来实现，它所提供的方法完全支持WS-Addressing协议所定义infoset中所有元素的操作。在Axis2中对服务的定位全部是基于EndPointReferance的。</PRE><PRE style="TEXT-INDENT: 24pt">MDP所定义的属性和相应的操作接口都提供了实现。</PRE><PRE style="TEXT-INDENT: 24pt">WSDL addressing-binding在目前版本中没有明确支持，但在一个开发成员的邮件中显示目前已经准备提供支持，但尚无发布相应模块。SOAP -binding在Axis2内核中得到完全的支持。需要明确引入Addresing模块才能处理，事实上仅仅在输入输出流中打开了相关的处理选项。</PRE><PRE>&nbsp;</PRE><PRE><STRONG><SPAN style="FONT-SIZE: 15pt">使用方法：</SPAN></STRONG></PRE><PRE>1．服务端：</PRE><PRE style="TEXT-INDENT: 24pt">在服务端默认情况下Addressing处理是已经嵌入的。加入Addressing需要将Addressing.mar模块放到module目录下，可以有以下几种方式：</PRE><PRE style="TEXT-INDENT: 24pt">一是通过在Axis2.xml配置文件中添加&lt;module ref="addressing"/&gt;，并在相应的管道如in flow和in faultflow中添加AddressingBasedDispatcher即可（注：Axis2中默认已经添加相应内容）</PRE><PRE style="TEXT-INDENT: 24pt">二是在管理控制台Engage相应addressing模块。在axis2.xml 配置文件中添加以下模块引用&lt;module ref="addressing"/&gt;</PRE><PRE>2．客户端：</PRE><PRE style="TEXT-INDENT: 24pt">在客户总端有两种方式加入Addressing处理模块:</PRE><PRE style="TEXT-INDENT: 24pt">一是在程序中显示加入。如下所示：（注意需要将Addressing.mar放到可访问路径下）</PRE><PRE style="TEXT-INDENT: 21pt"><SPAN style="FONT-SIZE: 10.5pt">stub._getServiceClient().engageModule(new</SPAN><SPAN style="FONT-SIZE: 10.5pt">　</SPAN></PRE><PRE style="TEXT-INDENT: 21pt"><SPAN style="FONT-SIZE: 10.5pt">javax.xml.namespace.QName( org.apache.axis2.Constants.MODULE_ADDRESSING ) );</SPAN></PRE><PRE>&nbsp;</PRE><PRE style="TEXT-INDENT: 24pt">二是在axis2.xml 配置文件中添加以下模块引用&lt;module ref="addressing"/&gt;（需要建立相应的ConfigurationContexst）</PRE><PRE>&nbsp;</PRE><PRE><STRONG><SPAN style="FONT-SIZE: 15pt">其它说明：</SPAN></STRONG></PRE><PRE style="TEXT-INDENT: 24pt">在Axis2中对服务进行定位时，根据以下四个信息来定位：HTTP request uri、SOAPAction、QName of the first child of SOAP Body element、WS-Addressing is enabled the address of To EPR。而且上述为默认的顺序，可以通过更改配置文件重新更改顺序。在启用Addressing时，SOAP头部信息的相关内容会自动覆盖重复的内容。</PRE><PRE style="TEXT-INDENT: 24pt">&nbsp;</PRE><PRE style="TEXT-INDENT: 24pt">Axis2中设置Addressing Properties是通过MessageContext来自动实现的，可以通过在MessageContext中设置相应的选项信息。在服务端， AddressingBasedDispatcher根据在消息头部信息中取得的属性信息来填充到MessageContext中，包括from、replyto、messagID等信息，并在返回时自动根据这些信息在返回头部中加入上述信息。</PRE><PRE style="TEXT-INDENT: 24pt">在客户可以通过两种方式来加入，一个使用ServiceClient,通过如下方式来加入的：</PRE><PRE style="TEXT-INDENT: 24pt">Options options = new Options();</PRE><PRE style="TEXT-INDENT: 24pt">options.setTo(new <SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EndpointReference("http://address-to-webservice.org/MyService/MyOperation"));</SPAN></PRE><PRE style="TEXT-INDENT: 24pt">ServiceClient sender = new ServiceClient();</PRE><PRE style="TEXT-INDENT: 24pt">sender.setOptions(options);</PRE><PRE style="TEXT-INDENT: 24pt">&nbsp;</PRE>
<DIV style="TEXT-INDENT: 24pt"><SPAN style="FONT-SIZE: 12pt">这样如果在嵌入Addressing处理模块时，并自动在头部加入相应的TO信息，其中MessageID由内部自动生成保证不会重复。</SPAN></DIV>
<DIV style="TEXT-INDENT: 24pt"><SPAN style="FONT-SIZE: 12pt">在默认情况下消息头部仅包括destination URL (To address) 和action ，其它可选参数都没有添加，如需要添加可以加入以下语句以提供支持。options.setProperty(INCLUDE_OPTIONAL_HEADERS, Boolean.TRUE);</SPAN></DIV>
<DIV>&nbsp;</DIV><PRE><STRONG><SPAN style="FONT-SIZE: 15pt">测试代码说明：</SPAN></STRONG></PRE>
<DIV style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt"><SPAN style="FONT-SIZE: 12pt">1．</SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">测试环境：</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt">Axis2 2.1.1<SPAN>　</SPAN>Tomcat 6.0 .Eclipse 3.2.</SPAN></DIV>
<DIV style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt"><SPAN style="FONT-SIZE: 12pt">2．</SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">BaseTest</SPAN></SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: 12pt">目的：</SPAN></DIV>
<DIV style="MARGIN-LEFT: 21pt"><SPAN style="FONT-SIZE: 12pt">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">测试对底层协议的无关性，包括</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt">TCP</SPAN><SPAN style="FONT-SIZE: 12pt">、</SPAN><SPAN style="FONT-SIZE: 12pt">HTTP</SPAN><SPAN style="FONT-SIZE: 12pt">和</SPAN><SPAN style="FONT-SIZE: 12pt">LOCAL</SPAN><SPAN style="FONT-SIZE: 12pt">。</SPAN></DIV>
<DIV style="MARGIN-LEFT: 21pt"><SPAN style="FONT-SIZE: 12pt">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">测试同步和异步调用的支持。</SPAN></SPAN></DIV>
<DIV style="MARGIN-LEFT: 21pt"><SPAN style="FONT-SIZE: 12pt">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">测试对单、双通道的支持。</SPAN></SPAN></DIV>
<DIV style="TEXT-INDENT: 24pt"><SPAN style="FONT-SIZE: 12pt">测试程序说明：服务端</SPAN><SPAN style="FONT-SIZE: 12pt">MyService2.aar</SPAN><SPAN style="FONT-SIZE: 12pt">。放置到</SPAN><SPAN style="FONT-SIZE: 12pt">Catalina_HOME/WebApps/Axis2/Service</SPAN><SPAN style="FONT-SIZE: 12pt">下即可，是一个</SPAN><SPAN style="FONT-SIZE: 12pt">Web</SPAN><SPAN style="FONT-SIZE: 12pt">服务。仅用到一个</SPAN><SPAN style="FONT-SIZE: 12pt">Echo</SPAN><SPAN style="FONT-SIZE: 12pt">方法。客户端则包括了一个测试主程序</SPAN><SPAN style="FONT-SIZE: 12pt">BaseTest</SPAN><SPAN style="FONT-SIZE: 12pt">和一个小工具类</SPAN><SPAN style="FONT-SIZE: 12pt">ClientUtil</SPAN><SPAN style="FONT-SIZE: 12pt">。</SPAN><SPAN style="FONT-SIZE: 12pt">BaseTest</SPAN><SPAN style="FONT-SIZE: 12pt">根据用户输入选择传输协议、调用方式（同步或异步）及是否打开单独的监听端口。</SPAN><SPAN style="FONT-SIZE: 12pt">ClientUtil</SPAN><SPAN style="FONT-SIZE: 12pt">则是辅助类，用来生成</SPAN><SPAN style="FONT-SIZE: 12pt">OMElement</SPAN><SPAN style="FONT-SIZE: 12pt">对象。其中用到</SPAN><SPAN style="FONT-SIZE: 12pt">EndpointReference</SPAN><SPAN style="FONT-SIZE: 12pt">属性设置等及</SPAN><SPAN style="FONT-SIZE: 12pt">Addresing</SPAN><SPAN style="FONT-SIZE: 12pt">等方法。</SPAN></DIV>
<DIV style="TEXT-INDENT: 24pt"><SPAN style="FONT-SIZE: 12pt">测试结果：全部通过。</SPAN></DIV>
<DIV style="TEXT-INDENT: 24pt">&nbsp;</DIV>
<DIV style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt"><SPAN style="FONT-SIZE: 12pt">3．</SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">RoutingTest.</SPAN></SPAN></DIV>
<DIV><SPAN style="FONT-SIZE: 12pt">目的：</SPAN></DIV>
<DIV style="MARGIN-LEFT: 21pt"><SPAN style="FONT-SIZE: 12pt">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">测试基于</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt">SOAP</SPAN><SPAN style="FONT-SIZE: 12pt">头部信息的路由功能。</SPAN></DIV>
<DIV style="MARGIN-LEFT: 21pt"><SPAN style="FONT-SIZE: 12pt">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">测试</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt">MessageID</SPAN><SPAN style="FONT-SIZE: 12pt">的关联功能，即能否实现有状态的交互。</SPAN></DIV>
<DIV style="MARGIN-LEFT: 21pt"><SPAN style="FONT-SIZE: 12pt">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">测试</SPAN></SPAN><SPAN style="FONT-SIZE: 12pt">out_only</SPAN><SPAN style="FONT-SIZE: 12pt">和</SPAN><SPAN style="FONT-SIZE: 12pt">in_out</SPAN><SPAN style="FONT-SIZE: 12pt">操作。</SPAN></DIV>
<DIV style="MARGIN-LEFT: 21pt"><SPAN style="FONT-SIZE: 12pt">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN dir=ltr><SPAN style="FONT-SIZE: 12pt">测试服务端配置。</SPAN></SPAN></DIV>
<DIV style="TEXT-INDENT: 20.5pt"><SPAN style="FONT-SIZE: 12pt">测试程序说明：服务端包括两个服务：</SPAN><SPAN style="FONT-SIZE: 12pt">PostOffice.aar</SPAN><SPAN style="FONT-SIZE: 12pt">和</SPAN><SPAN style="FONT-SIZE: 12pt">Publisher.aar</SPAN><SPAN style="FONT-SIZE: 12pt">。分别用来模拟邮局订阅服务和出版社邮购服务。客户端则为</SPAN><SPAN style="FONT-SIZE: 12pt">RoutingTest.java</SPAN><SPAN style="FONT-SIZE: 12pt">。主要提供两个操作。一个是向邮局发送订阅请求，些为单向，不需要回复，因为邮局可能需要等待出版社确认有无此书。二是读者向邮局查询自己订阅的情况，邮局接到消息后，根据</SPAN><SPAN style="FONT-SIZE: 12pt">replyto</SPAN><SPAN style="FONT-SIZE: 12pt">设定的地址，将消息不是返回给读者，而是自动向出版社转发，由出版社给出相应的订阅结果信息。基于流程如下图所示：</SPAN></DIV>
<DIV>&nbsp;</DIV><PRE><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subScribe (MessageId: A)</SPAN></PRE><PRE>Client -------------------------------------------------&gt; PostOffice</PRE><PRE><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></PRE><PRE><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getInfo (MessageId: B, RelatesTo:null)</SPAN></PRE><PRE>Client -----------------------------------------------<SPAN>à</SPAN> PostOffice</PRE><PRE><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></PRE><PRE><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printPublishInfo (MessageId: C, RelatesTo: B)&nbsp;&nbsp; </SPAN></PRE><PRE>PostOffice ----------------------------------------------&gt;Publisher </PRE><PRE>&nbsp;</PRE><PRE><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;returnInfo (MessageId: D, RelatesTo: B)&nbsp;&nbsp; </SPAN></PRE><PRE>Publisher ----------------------------------------------&gt;Client </PRE><PRE><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></PRE>
<DIV style="TEXT-INDENT: 24pt"><SPAN style="FONT-SIZE: 12pt">注意上面第四步没有实现，因为，需要在客户端运行一个服务，鉴于例子的复杂性。且其路由方式和第三步是相同的所以略去，仅由publisher打印出确认信息结果。</SPAN></DIV>
<DIV style="TEXT-INDENT: 24pt"><SPAN style="FONT-SIZE: 12pt">测试结果。Axis2可以根据头部信息将相应的消息路由到其它服务结点，实现了完全基于Addresing头部信息的路由。此外，在转发的同时，能够对消息ID号进行关联。单向消息传递也支持很好，可以根据需要在出现异常时返回异常信息或将异常重定向到其它结点。</SPAN></DIV>
<DIV style="TEXT-INDENT: 24pt"><SPAN style="FONT-SIZE: 12pt">提示，为了更准确看到整个消息内容，可以使用Axis2下来的SOAPMonitor工具，需要在Axis2配置文件中打开监控模块，并将SOAP_Moinitor.jar文件解压放到Axis根据目录下即可。输入<A href="http://localhost:8080/axis2/SOAPMonitor"><SPAN style="COLOR: windowtext; TEXT-DECORATION: none; text-underline: none">http://localhost:8080/axis2/SOAPMonitor</SPAN>可看到实时信息。</A></SPAN></DIV>
<DIV>&nbsp;</DIV>
<DIV>提示：在客户端将Axis2下的jar包和Addressing1.1.mar回到路径下能运行。</DIV>
<DIV>&nbsp;</DIV>
<DIV><STRONG><SPAN style="FONT-SIZE: 15pt">CXF</SPAN></STRONG></DIV>
<DIV><STRONG><SPAN style="FONT-SIZE: 15pt">支持情况：</SPAN></STRONG></DIV>
<DIV><SPAN style="FONT-SIZE: 12pt">支持的版本： submission(2004.8)和core 1.0(2006.5)两个版本。</SPAN></DIV>
<DIV>&nbsp;</DIV>
<DIV style="TEXT-INDENT: 24pt"><SPAN style="FONT-SIZE: 12pt">通过EndpointReference类型支持WS-Addressing定义infoset中所有元素的操作。</SPAN></DIV><PRE style="TEXT-INDENT: 24pt">MDP所定义的属性属性都定义了相应的操作接口。</PRE>
<DIV style="TEXT-INDENT: 24pt"><SPAN style="FONT-SIZE: 12pt">WSDL addressing-binding</SPAN><SPAN style="FONT-SIZE: 12pt">得到明确支持，</SPAN></DIV><PRE style="TEXT-INDENT: 24pt">SOAP addressing-binding在CXF中得到支持，但需要嵌入Addresing Interceptor才能处理。</PRE><PRE><STRONG><SPAN style="FONT-SIZE: 15pt">使用方法：</SPAN></STRONG></PRE><PRE>1．服务端和客户端可以有以下几种方式：</PRE>
<DIV align=left>&nbsp;</DIV><PRE>一是通过在配置文件中添加下面的内容在BUS上加入Addressing Interceptor。</PRE>
<DIV style="TEXT-INDENT: 54pt" align=left><SPAN style="FONT-SIZE: 10pt; COLOR: black">&nbsp;</SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000e1">&lt;cxf:bus&gt;</SPAN></DIV>
<DIV style="TEXT-INDENT: 54pt" align=left><SPAN style="FONT-SIZE: 10pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000e1">&lt;cxf:features&gt;</SPAN></DIV>
<DIV style="TEXT-INDENT: 54pt" align=left><SPAN style="FONT-SIZE: 10pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000e1">&lt;wsa:addressing/&gt;</SPAN></DIV>
<DIV style="TEXT-INDENT: 54pt" align=left><SPAN style="FONT-SIZE: 10pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="FONT-SIZE: 10pt; COLOR: #0000e1">&lt;/cxf:features&gt;</SPAN></DIV><PRE style="TEXT-INDENT: 54pt"><SPAN style="FONT-SIZE: 10pt; COLOR: #0000e1">&lt;/cxf:bus&gt;</SPAN>，</PRE><PRE style="TEXT-INDENT: 24pt">二是在通过spring配置文件加入</PRE><PRE style="TEXT-INDENT: 24pt">三是程序中显示加入</PRE><PRE>例子再说吧：</PRE>
<DIV><STRONG><FONT size=4><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 12pt">测试结果：</SPAN></FONT></STRONG></DIV>
<DIV><STRONG><FONT size=4><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 12pt">对异步支持较好，但是目前路由及messageId自动关联没有通过。原因….</SPAN></FONT></STRONG></DIV>
<DIV><STRONG><FONT size=4><SPAN style="FONT-WEIGHT: normal; FONT-SIZE: 12pt">目前只支持SOAP1.1而Axis2支持SOAP1.1和SOAP1.2</SPAN></FONT></STRONG></DIV><img src ="http://www.cnblogs.com/huqingyu/aggbug/1215897.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41817/" target="_blank">[新闻]Intel首次公开展示Nehalem架构迅驰3平台</a>]]></description></item><item><title>Axis2联接WCF(比较完整的版本)</title><link>http://www.cnblogs.com/huqingyu/archive/2008/06/07/1215658.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Sat, 07 Jun 2008 09:05:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/06/07/1215658.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1215658.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/06/07/1215658.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1215658.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1215658.html</trackback:ping><description><![CDATA[<P>分basicHttpBinding和wsHttpBinding两种情况:<BR><BR>一、basicHttpBinding比较简单一点,先来看看它所要求的HTTP包:<BR>POST /WCFService1/Service.svc HTTP/1.1<BR>Content-Type: application/soap+xml; charset=utf-8<BR>Host: 127.0.0.1:3673<BR>Content-Length: 566<BR>Expect: 100-continue<BR>Connection: Keep-Alive<BR><BR>&lt;s:Envelope xmlns:s="<A href="http://www.w3.org/2003/05/soap-envelope">http://www.w3.org/2003/05/soap-envelope</A>"&gt;<BR>&nbsp;&nbsp; &lt;s:Body&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;MyOperation2 xmlns="<A href="http://tempuri.org/">http://tempuri.org/</A>"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;myValue1&gt;3&lt;/myValue1&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/MyOperation2&gt;<BR>&nbsp;&nbsp; &lt;/s:Body&gt;&lt;/s:Envelope&gt;<BR><BR>经过tcpmon-1.0查看AXIS2发的包，头里边有个chunk然后没有Content-Length，所以在程序中axis2需要关掉chunk开关:<BR>_messageContext.setProperty(HTTPConstants.CHUNKED, "false");<BR><BR>把chunk关掉后，会自动加上Content-Length。另外，Expect 100-continue与Connection: Keep-Alive还没生成，但不影响AXIS2调用WCF了。<BR><BR>二、wsHttpBinding稍微复杂一点点<BR>还是先来看看它所需要的包：<BR>POST /WCFService1/Service.svc HTTP/1.1<BR>Content-Type: application/soap+xml; charset=UTF-8; <BR>Host: 127.0.0.1:3673<BR>Content-Length: 642</P>
<P>&lt;?xml version='1.0' encoding='UTF-8'?&gt;<BR>&nbsp;&nbsp; &lt;soapenv:Envelope xmlns:soapenv="<A href="http://www.w3.org/2003/05/soap-envelope">http://www.w3.org/2003/05/soap-envelope</A>"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;soapenv:Header xmlns:wsa="<A href="http://www.w3.org/2005/08/addressing">http://www.w3.org/2005/08/addressing</A>"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsa:To&gt;http://127.0.0.1:3673/WCFService1/Service.svc&lt;/wsa:To&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsa:ReplyTo&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsa:Address&gt;http://www.w3.org/2005/08/addressing/anonymous&lt;/wsa:Address&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/wsa:ReplyTo&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsa:MessageID&gt;urn:uuid:651A41AA122CE788291212918783422&lt;/wsa:MessageID&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;wsa:Action&gt;http://tempuri.org/IMyService/MyOperation2&lt;/wsa:Action&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/soapenv:Header&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;soapenv:Body&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ns1:MyOperation2 xmlns:ns1="<A href="http://tempuri.org/">http://tempuri.org/</A>"&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ns1:myValue1&gt;33&lt;/ns1:myValue1&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ns1:MyOperation2&gt;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/soapenv:Body&gt;<BR>&nbsp;&nbsp; &lt;/soapenv:Envelope&gt;<BR><BR>它与basicHttpBinding有什么区别？区别在于多了Soapenv:Header部分，而且使用了WS-Addressing。所以要使AXIS2的WS-Addressing enable，怎么弄？网上找了很久，说是sample中有的，就去看sample：axis2-1.4\samples\userguide\src\userguide\clients\ClientSideModuleEngagement.java<BR>原来要先读一个axis2.xml这样的配置文件<BR><BR>我在最长的构造函数中加入了这么一句：<BR>&nbsp;public WSHttpBinding_IMyServiceStub(<BR>&nbsp;&nbsp;&nbsp;org.apache.axis2.context.ConfigurationContext configurationContext,<BR>&nbsp;&nbsp;&nbsp;java.lang.String targetEndpoint, boolean useSeparateListener)<BR>{<BR>&nbsp;&nbsp;if(configurationContext == null)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File repository = new File("D:\\Program Files\\axis2-1.4\\repository");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!repository.exists()) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new FileNotFoundException("Repository Doesnot Exist");<BR>&nbsp;&nbsp;&nbsp;&nbsp;} catch (FileNotFoundException e) {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //copy the LoggingModule.mar to "modules" folder.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //then modify the axis2.xml that is generating there according to<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //phases that being included in the "module.xml"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; configurationContext = ConfigurationContextFactory.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createConfigurationContextFromFileSystem(repository.getAbsolutePath(),<BR>"D:\\Program Files\\axis2-1.4\\conf\\axis2.xml");<BR>&nbsp;&nbsp;}<BR>...<BR>}<BR><BR>一般装好的axis2.xml都会加入所有的modules，其中会包括addressing，所以是有效的。能不能最简自己再试试吧。<BR>然后再加入以下几句：<BR>&nbsp;&nbsp;_serviceClient.engageModule(new javax.xml.namespace.QName( org.apache.axis2.Constants.MODULE_ADDRESSING ) );//编译器说这个过时了，新的不知道怎么写，先将就着吧<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;_serviceClient.getOptions().setTo(new EndpointReference(<A href="http://127.0.0.1:3673/WCFService1/Service.svc">http://127.0.0.1:3673/WCFService1/Service.svc</A>)); //写上&lt;soapenv:header&gt;中&lt;wsa:To&gt;的地址<BR><BR>&nbsp;&nbsp;_serviceClient.getOptions().setProperty( AddressingConstants.INCLUDE_OPTIONAL_HEADERS, Boolean.TRUE); // 不加这句的话在&lt;soapenv:header&gt;只有&lt;wsa:To&gt;&nbsp;和&lt;wsa:Action&gt;还有&lt;wsa:MessageID&gt;，其中MessageID是自动生成的一个唯一的编号<BR><BR><BR>三、Mtom<BR>经过上面的折磨，Mtom相对来说简单一点，只要在WCF服务器端打开Mtom，然后客户端在axis2.xml中有个&lt;parameter name="enableMTOM"&gt;false&lt;/parameter&gt;，改成true就好了。</P><img src ="http://www.cnblogs.com/huqingyu/aggbug/1215658.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41816/" target="_blank">[新闻]Pogo浏览器</a>]]></description></item><item><title>WSIT联接WCF</title><link>http://www.cnblogs.com/huqingyu/archive/2008/05/24/1206476.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Sat, 24 May 2008 09:00:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/05/24/1206476.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1206476.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/05/24/1206476.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1206476.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1206476.html</trackback:ping><description><![CDATA[wsit是sun的一个项目,要使它每次不需要读取WSDL,我们把WSDL下载来放在本地:<BR><BR>1)用Netbeans生成客户端的WCF引用配置<BR><BR>META-INF/wsit-client.xml<BR>META-INF/service.svc.xml<BR><BR>2)保存网络上的WSDL到bin下<BR>XXXProject/bin/Service.svc.wsdl<BR><BR>3)每次生成service类的时候读取bin下的WSDL,而不是去读http://XXX/Service.svc?wsdl<BR><BR>baseUrl = org.tempuri.Service.class.getResource("/");<BR>URL url = new (baseUrl, "Service.svc.wsdl")<BR><BR>4)在运行时修改真正的地址:<BR><BR>((javax.xml.ws.BindingProvider)port).getRequestContext().put(javax.xml.ws.BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "NEW_ADDRESS_HERE");<BR><BR><BR><img src ="http://www.cnblogs.com/huqingyu/aggbug/1206476.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41807/" target="_blank">[新闻]洪磊口述:番茄花园如何捆绑流氓软件月入十万</a>]]></description></item><item><title>XmlSerializer vs DataContractSerializer: Serialization in Wcf </title><link>http://www.cnblogs.com/huqingyu/archive/2008/05/24/1206401.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Sat, 24 May 2008 05:53:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/05/24/1206401.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1206401.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/05/24/1206401.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1206401.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1206401.html</trackback:ping><description><![CDATA[摘要: Ref: http://www.danrigsby.com/blog/index.php/2008/03/07/xmlserializer-vs-datacontractserializer-serialization-in-wcf/ http://www.cnblogs.com/javafun/archive/2008/05/04/1182033.htmlThe XmlSerializer ha&nbsp;&nbsp;<a href='http://www.cnblogs.com/huqingyu/archive/2008/05/24/1206401.html'>阅读全文</a><img src ="http://www.cnblogs.com/huqingyu/aggbug/1206401.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41807/" target="_blank">[新闻]洪磊口述:番茄花园如何捆绑流氓软件月入十万</a>]]></description></item><item><title>Java: 使用proxy连接URL</title><link>http://www.cnblogs.com/huqingyu/archive/2008/05/19/1202874.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Mon, 19 May 2008 14:43:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/05/19/1202874.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1202874.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/05/19/1202874.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1202874.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1202874.html</trackback:ping><description><![CDATA[<P>The Authenticator method isn't working for me, using JDK 1.3.1_06 and JSSE 1.0.3_01. I still get the 407 error. My code works just fine under 1.4.1, however. <BR>
<P>Is there a way to make it work under 1.3.1. Are other people having these problems with it? 
<P>Here's my code: <BR>// get proxy and port from command line <BR>SecureClient.proxyhost = args[2]; // <BR>SecureClient.proxyport = args[3]; // 
<P><BR>// set the JSSE system properties <BR>System.setProperty("https.proxyHost", SecureClient.proxyhost); <BR>System.setProperty("https.proxyPort", SecureClient.proxyport); 
<P><BR>System.out.println("using proxy: "+ SecureClient.proxyhost + " port " + SecureClient.proxyport); 
<P><BR>// now create http authentication 
<P><BR>// this didn't work <BR>// System.setProperty("http.proxyUser", "myuser"); <BR>// System.setProperty("http.proxyPassword", "mypassword"); 
<P><BR>// this worked in 1.4.1 <BR>Authenticator.setDefault( new httpAuthenticateProxy() ); <BR>.......................................... <BR><BR>and here's my authenticator class: <BR><BR>public class httpAuthenticateProxy extends Authenticator { <BR><BR>protected PasswordAuthentication getPasswordAuthentication() { <BR>// username, password <BR>// sets http authentication <BR>return new PasswordAuthentication("myuser","mypassword".toCharArray()); <BR>} <BR><BR>} <BR>............................................. </P><img src ="http://www.cnblogs.com/huqingyu/aggbug/1202874.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41813/" target="_blank">[新闻]2008年8月21日IT博客精选：盖茨复出？</a>]]></description></item><item><title>[Java] 使用cookie保持Session (Axis2 和 WSIT)</title><link>http://www.cnblogs.com/huqingyu/archive/2008/05/08/1188368.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Thu, 08 May 2008 05:50:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/05/08/1188368.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1188368.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/05/08/1188368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1188368.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1188368.html</trackback:ping><description><![CDATA[<P>Axis2:<BR><BR>Session:_operationClient.getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.HEADER_COOKIE, strCookie);<BR>&nbsp;&nbsp;&nbsp;_operationClient.getOptions().setManageSession(true);<BR><BR><BR></P>
<P>Axis2 压缩 Gzip:<BR>_operationClient.getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.MC_ACCEPT_GZIP, Boolean.TRUE);</P>
<P><BR><BR><BR>WSIT:<BR>&nbsp;&nbsp;Service s = new Service();<BR>&nbsp;&nbsp;BindingProvider bt = (BindingProvider) s.getWSHttpBindingIService();<BR>&nbsp;&nbsp;bt.getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);<BR>&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;IService t = (IService) bt;</P>
<P>&nbsp;&nbsp;String str = t.doWork("aa1");<BR>&nbsp;&nbsp;System.out.println(str);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;Headers headers = (Headers) bt.getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS);<BR>&nbsp;&nbsp;Headers headersForRequest = new Headers();</P>
<P>&nbsp;&nbsp;Iterator&lt;String&gt; iterator = headers.keySet().iterator();<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;for(; iterator.hasNext();)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;String key = iterator.next();<BR>&nbsp;&nbsp;&nbsp;List&lt;String&gt; value = headers.get(key);<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;System.out.println(key);<BR>&nbsp;&nbsp;&nbsp;System.out.println(value);<BR>&nbsp;&nbsp;&nbsp;System.out.println("----");<BR>&nbsp;&nbsp;&nbsp;</P>
<P>&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;if(key != null)<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(key.toLowerCase().equals("set-cookie"))<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = "cookie";<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;headersForRequest.put(key, value);<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;String str2 = t.doWork("aa2");<BR>&nbsp;&nbsp;System.out.println(str2);<BR>&nbsp;&nbsp;</P>
<P><BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;Service2 ss = new Service2();<BR>&nbsp;&nbsp;BindingProvider btt = (BindingProvider) ss.getWSHttpBindingIService2();<BR>&nbsp;&nbsp;btt.getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true);<BR>&nbsp;&nbsp;btt.getRequestContext().put(MessageContext.HTTP_REQUEST_HEADERS, headersForRequest);<BR>&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;IService2 tt = (IService2) btt;<BR>&nbsp;&nbsp;</P>
<P>&nbsp;&nbsp;String vstr = tt.doWork("aabb1");<BR>&nbsp;&nbsp;System.out.println(vstr);<BR>&nbsp;&nbsp;<BR>&nbsp;&nbsp;String vstr2 = tt.doWork("aabb2");<BR>&nbsp;&nbsp;System.out.println(vstr2);<BR>//&nbsp;&nbsp;XWSSecurityConfiguration.MESSAGE_SECURITY_CONFIGURATION;<BR></P><img src ="http://www.cnblogs.com/huqingyu/aggbug/1188368.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41812/" target="_blank">[新闻]微软宣布将斥资1亿美元购买Novell证书</a>]]></description></item><item><title>WS-ReliableMessaging interoperability between Microsoft WCF and Sun WSIT</title><link>http://www.cnblogs.com/huqingyu/archive/2008/04/29/1175402.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Mon, 28 Apr 2008 18:04:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/04/29/1175402.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1175402.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/04/29/1175402.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1175402.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1175402.html</trackback:ping><description><![CDATA[摘要: WS-ReliableMessaging interoperability between Microsoft WCF and Sun WSIT.style1 {	background-color: #FFFF00;}src:http://weblogs.asp.net/gsusx/archive/2007/07/09/ws-reliablemessaging-interoprability-be&nbsp;&nbsp;<a href='http://www.cnblogs.com/huqingyu/archive/2008/04/29/1175402.html'>阅读全文</a><img src ="http://www.cnblogs.com/huqingyu/aggbug/1175402.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41811/" target="_blank">[新闻]携程谷歌将联合发旅游榜单</a>]]></description></item><item><title>[转] Webservice 的设计和模式 </title><link>http://www.cnblogs.com/huqingyu/archive/2008/04/27/1172681.html</link><dc:creator>龍龙</dc:creator><author>龍龙</author><pubDate>Sat, 26 Apr 2008 16:14:00 GMT</pubDate><guid>http://www.cnblogs.com/huqingyu/archive/2008/04/27/1172681.html</guid><wfw:comment>http://www.cnblogs.com/huqingyu/comments/1172681.html</wfw:comment><comments>http://www.cnblogs.com/huqingyu/archive/2008/04/27/1172681.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/huqingyu/comments/commentRss/1172681.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/huqingyu/services/trackbacks/1172681.html</trackback:ping><description><![CDATA[<DIV class=post>
<DIV class=posthead>
<H2>&nbsp;</H2>Posted on 2004-12-13 21:48 <A href="http://idior.cnblogs.com/">idior</A> 所属分类: <A href="/idior/category/17924.html">Design</A> 、<A href="/idior/category/47114.html">Web Services &amp; SOA</A> <IMG height=1 src="/idior/aggbug/76600.html?webview=1" width=1> <!--
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
<rdf:Description
rdf:about="http://www.cnblogs.com/idior/archive/2004/12/13/76600.html"
dc:identifier="http://www.cnblogs.com/idior/archive/2004/12/13/76600.html"
dc:title="Webservice 的设计和模式"
trackback:ping="http://www.cnblogs.com/idior/services/trackbacks/76600.aspx" />
</rdf:RDF>
--></DIV>
<DIV class=postbody>
<DIV>本文是篇译文（原文在<A href="http://www.devx.com/enterprise/Article/10397" target=_blank>devx</A>），对于想初步了解webservice的朋友可能有些帮助。<BR><BR>Webservice 作为一项新的技术出现在我们面前，它的出世是用于解决在不同的平台下的应用的协同的。目前几乎每家厂商都要去开发Webservice 应用，然而如果缺乏对Webservice更深的了解，不能很好的在设计阶段处理好一些重要的问题，那么最终完成的系统必然是效率低下，没有可靠性的产品。 </DIV>
<DIV>&nbsp;</DIV>
<DIV>在设计Webservice 应用时，以下几点务必要考虑到：</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 管理好与外系统的协同关系</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 掌握底层的传输模型</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 提供与应用相适应的安全策略</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 计划好部署的相关事项</DIV>
<DIV>&nbsp;</DIV>
<DIV>以下，将就这几条相关的设计需求和一些常用模式是如何应用于Webservice模型展开详细讨论。在讨论中，你会发现Webservice这项新的技术是如何与我们在以往的软件开发相结合的。</DIV>
<DIV>&nbsp;</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 标准提供了协同的能力</DIV>
<DIV>&nbsp;</DIV>
<DIV>Webservice的一个最基本的目的就是提供在各个不同平台的不同应用系统的协同工作能力。</DIV>
<DIV>为了使得一个公司的网络应用达到最高的效率，存在它自己和它的合作伙伴，供应商以及客户之间的Webservice，应该能够实现无缝的交互。如果在众多的Webservice之间不能轻松的实现交互，那么该应用的效率将大打折扣。但是，在现实中这种情况是极有可能出现的。由于各个公司对业务的理解各不相同，就是理解相同的情况下，对于相同的概念也可能用不同的形式加以表现，具体而言就是对于同一数据可能采取不同的xml表示。由于以上的原因，对于协同性的问题应该在设计应用架构时就加以考虑，而不是留待以后去改变。</DIV>
<DIV>&nbsp;</DIV>
<DIV>Webservice 主要由以下几块技术所构成，SOAP (Simple Object Access Protocol), WSDL (Web service Description Language), 以及UDDI (Universal Description, Discovery and Integration)。</DIV>
<DIV>&nbsp;</DIV>
<DIV></DIV>
<DIV>在这里我们不会去详细研究这些技术，而是揭示他们的一些重要特性，这些特性需要在Webservice的设计时详加考虑。</DIV>
<DIV>&nbsp;</DIV>
<DIV>WSDL是实现协同能力的关键，它提供了一份契约用于与新老的应用之间交互。这项技术使得各个组织可以将标准的制定集中在Service的外部接口，而不用考虑各组织的具体实现。简而言之，它实现了Webservice的接口与实现的分离。从而使得标准的制定，更加容易。并且，基于这份接口描述，很多工具可以从中自动生成客户端代码，减少了开发者的工作量，并使得大部分开发者摆脱了编写SOAP消息传递代码过程。</DIV>
<DIV>&nbsp;</DIV>
<DIV>SOAP是实现在各个Webservice组件之间传递消息的传输层。因此，SOAP应该是一项透明的协同技术。但是，由于很多的SOAP实现方法却与标准背道而驰，要么添加了新的扩展功能要么删减了一些标准功能。由于对SOAP标准的支持程度不同，使得Webservice的协同能力大打折扣，实现协同的困难加大了。基于这种情况，当开发者需要Webservice运行在不同平台上时，就要对具体情况加以了解并相应的编码以解决这种不一致性。如果所有的SOAP实现组织都能够遵循标准的话，那么Webservice的开发者就不需要考虑使用该Webservice的底层平台了。</DIV>
<DIV>&nbsp;</DIV>
<DIV>尽管如此，不同SOAP实现的协同还是相当困难，因为协同标准的制定存在大量的分歧，目前一些组织正致力于标准的制定，比如<A href="http://www.soapbuilders.org/">SOAP Builders</A> 和 <A href="http://www.ws-i.org/">WS-I</A>。然而，现在Webservice开发者只有针对不同平台，给予不同的实现，使得开发的成本和负担加大了。 </DIV>
<DIV>&nbsp;</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 理解传输模型</DIV>
<DIV>&nbsp;</DIV>
<DIV>SOAP并不是完全透明的解决方案，它把一些复杂的实现细节隐藏起来。Webservice的开发者必须深入的了解SOAP，了解底层的传输机制以及模型,从而知道SOAP是如何实现的。在一些简单的应用中，某些工具可以帮助Webservice的开发者生成SOAP消息传递的代码，但是这只在最简单的应用中有效。真正的情况不可能那么简单，可能在某些方面你需要有特殊的处理（这种情况在实际开发中是很常见的），这个时候，你就需要直接操纵SOAP的消息传递代码，以及一些底层的XML内容。因此，Webservice的开发者需要深入了解SOAP和XML层的内容。</DIV>
<DIV>&nbsp;</DIV>
<DIV>在开发Webservice的接口的时候，不要以为使用XML技术，协作性的问题就迎刃而解了，XML并不是解决集成问题的灵丹妙药。这里同样需要标准的制定，需要一个在业界公认的词汇表。仅仅在你的设计框架中引入XML技术并不能保证系统具有协同性，XML仅仅是用来描述数据的语言，XML自己并不提供语义去理解数据。就如同英语和德语都使用拉丁字母，但是他们的语义却并不相同。</DIV>
<DIV>&nbsp;</DIV>
<DIV>即使你使用相同的语言，也不能保证具有良好的协作性。比如你的公司可能使用Order描述一个订单，但你的合作伙伴可能使用Purchase_Order，而另一个伙伴可能又不相同。你不可能强迫你所有的合作伙伴都采用和你相同的词汇。因此需要有一项技术可以在众多的描述之间充当翻译的角色。XSLT就是这么一种技术，它用于不同语言的转换。和XSLT的配合使用XML才能解决协同性的问题。</DIV>
<DIV>&nbsp;</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM vs. SAX</DIV>
<DIV>许多的Webservice开发环境，将开发者从底层的XML文档的解析和处理中解放出来，他们提供了自动化或者很方便的工具，使得这一过程变得很简单。但是对于一些有特殊要求的Webservice应用，比如需要更好的柔性或者对速度要求特别高的应用，就需要手工处理XML文档。这时候两种XML解析的模型－DOM 和SAX的选择，将成为重要的问题。</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp; </DIV>
<DIV>DOM使用树状图的方式解析XML文档，而SAX则更多的采用事件驱动的模型。</DIV>
<DIV>&nbsp;</DIV>
<DIV>DOM先将XML文档映射成一颗树，然后通过采用一系列与树相关的操作去处理这份文档。这种方法有很多的好处，首先开发者很容易理解，使用一颗树这对于开发者来说是最常见不过的了。DOM最常用于XML在Service中需要频繁修改的场合。当然DOM也有它的缺点，在处理XML文档的时候，它需要载入整个文档，而不管你需要修改的是否只是其中的一小部分。因此它的运行效率以及对内存的使用显然是不能接受的，尤其是面对很大的XML文档。</DIV>
<DIV>SAX使用事件驱动的模型来处理XML文档。通过一系列事件的触发，来完成对XML的解析，你可以只关心你所要处理的事件，当这些事件发生时，会调用到相应的回调函数来通知到你。采用这种方式就可以在很大程度上提高XML文档解析的效率。但是它的缺点在于难于使用，以及对同一文档的多次处理会存在一些问题。</DIV>
<DIV>总而言之，DOM更适合处理那种文档型的XML文件，而SAX则适于那种想直接将XML结构映射成在你系统中的一个对象的操作。（比如将一个XML结构直接映射成JAVA中的一个Class）或者那种针对XML文件中特殊Tag的操作。</DIV>
<DIV>&nbsp;</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文档交换vs. RPC模型</DIV>
<DIV>这两种交互方式应该在应用架构的设计初始就应该详加考虑，因为它将在很大程度上决定系统的耦合程度。</DIV>
<DIV>RPC（Remote Procedure Call）本质上就是远程方法的调用。尽管Webservice是基于XML的但是你仍然可以使用远程方法调用这种模式来进行Webservice的实现，尤其是在那种简单的请求相应的模型中。在这个过程中，传输中的XML文件所描述的更多是有关远程方法的信息，比如方法名，方法参数等等。</DIV>
<DIV>而文档交换方式，与RPC相比较在XML文件中不是做远程方法的映射，而是一份完整的自包含的业务文档，当Service端收到这份文档后，先进行预处理（比如词汇的翻译和映射），然后再构造出返回消息。这个构造返回消息的过程中，往往不再是简简单单的一个方法调用，而是多个对象协同完成一个事务的处理，再将结果返回。</DIV>
<DIV></DIV>
<DIV>这两种方式的区别，类似与打电话和发邮件的不同处理方法。在目前，对于第一种方法提供了很多自动化的工具使得远程方法的调用能够很容易的完成，而后一种方法缺少一系列工具的支持，需要开发者手工完成。</DIV>
<DIV>尽管如此，在此还是推荐使用文档交换的方式。由于它在以下方面具有RPC所不具备的优点。</DIV>
<DIV>使用文档方式，你可以充分利用XML文件的功能去描述和验证一份业务文档，而在RPC模型中XML仅仅被用于描述方法的信息。</DIV>
<DIV>使用文档方式，在客户的Service的提供者之间不再需要紧密的约定，而RPC模型需要客户和Service的提供者紧密相连，一旦方法发生变化，客户端就需要做相应的改动。这不符合低耦合系统的要求，而在文档交换方式中则灵活的多。</DIV>
<DIV>由于业务数据是自包含的，显然文档模型更利于采用异步处理。</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 利用设计模式</DIV>
<DIV>设计模式在设计Webservice的时候显然可以起到相当大的作用。设计模式的主要目的就是为解决某些在类似环境下的相像问题提供已有的较为成熟的设计方案。在这里，只简单的提及一些很常用的模式，让我们了解到模式在Webservice中可以起到的作用。</DIV>
<DIV>Adapter ：为内部系统提供一个不同的接口</DIV>
<DIV>Façade： 封装复杂的内部实现，提供一系列简单的接口</DIV>
<DIV>Proxy： 作为其他对象的代理，代替它提供服务</DIV>
<DIV>&nbsp;</DIV>
<DIV>Adapter模式用于将一个组件的接口转化成客户所需要的样子，这里的客户就是Webservice。一个常见的情况就是将原有的老的系统包装成一个Webservice。比如现在使用的是J2EE的平台，而原来有一个C++的系统实现了某些功能，现在需要将它发布成Webservice，那么就需要利用JNI技术做一个Adapter，为原来的C++组件提供一个Java的接口，然后再转化为Webservice。</DIV>
<DIV>&nbsp;</DIV>
<DIV>Façade模式用于构建粗粒度的服务，它包装了细粒度的服务，从而为复杂的系统提供了一个简单的接口。在J2EE中，Session Bean就象是一个Façade，而Entity Bean则是细粒度的服务。在Webservice中也一样，使用Façade模式可以将已有的组件的功能发挥殆尽。</DIV>
<DIV></DIV>
<DIV>&nbsp;</DIV>
<DIV>Proxy 模式用于充当其他对象的代理，类似于中间人的作用，将处理工作从一个对象传递到另一个对象。在Webservice中，它主要用于隐藏Soap消息构造的过程。也可以用于模拟对象（Mock Object）的创建。</DIV>
<DIV>&nbsp;</DIV>
<DIV>以上仅仅是一些可以用于Webservice开发的模式，如果你熟练的将这些模式应用于Webservice开发，你将会发现开发Webservice应用，将好像做一种特殊的面向对象设计。</DIV>
<DIV>&nbsp;</DIV>
<DIV>l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安全</DIV>
<DIV>Webservice为作为方便的服务被用广大领域使用的同时，也成为了黑客们的美食。在这里，本文将就目前对Webservice安全所能做的改进做简单介绍。</DIV>
<DIV>在Webservice中的安全主要分为以下三个方面。</DIV>
<DIV>传输&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SSL/HTTPS 对连接加密，而不是传输数据</DIV>
<DIV>消息&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据加密(XML Encryption) &nbsp;&nbsp;数字签名(XML-DSIG)</DIV>
<DIV>底层架构&nbsp; 利用应用服务安全机制</DIV>
<DIV>&nbsp;</DIV>
<DIV>传输时的安全是最容易被加入到你的Webservice应用中的，利用现有的SSL 和HTTPS协议，就可以很容易的获得连接过程中的安全。</DIV>
<DIV>&nbsp;</DIV>
<DIV>然而这种安全实现方法有两个弱点。一是它只能保证数据传输的安全，而不是数据本身的安全，数据一旦到达某地，那么就可以被任何人所查看。而在Webservice中，一份数据可能到达多个地方，而这份数据却不该被所有的接受者所查看。二是它提供的是要么全有要么全无的保护，你不能选择哪部分数据要被保护，而这种可选择性也是在Webservice中所常要用到的。</DIV>
<DIV>&nbsp;</DIV>
<DIV>第二层的保护是对于消息本身的保护。你可以使用已有的XML安全扩展标准，实现数字签名的功能，从而保证你的消息是来自特定方并没有被修改过。XML文件的加密技术从更大程度上加强了Webservice的安全，它能够定制数据传输到后，能否被接受者所查看，进一步完善了传输后的安全，业界也在不断的制定Webservice的安全标准，比如SAML 和 WS-Security。</DIV>
<DIV>&nbsp;</DIV>
<DIV>最后一层保护就是依靠底层架构的安全，这更多的来自于操作系统和某些中间件的保护。比如在J2EE中，主持Webservice的应用服务器。目前很多的J2EE应用服务器都支持Java Authentication and Authorization Service (JAAS)，这是最近被加入到J2SE 1.4当中的。利用主持Webservice的服务器，实现一些安全机制这是很自然的做法。另一种利用底层架构的安全方法就是，做一个独立的负责安全的服务器，Webservice的使用者和创建者都需要与之取得安全信任。<BR><BR>推荐资料<BR><A href="http://idior.cnblogs.com/archive/2006/05/16/354066.aspx">Web Services Security</A><BR></DIV></DIV></DIV><img src ="http://www.cnblogs.com/huqingyu/aggbug/1172681.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/41810/" target="_blank">[新闻]商刊:Google不可能永远领先 微软寄希望于时间</a>]]></description></item></channel></rss>