竹十一
          在匆忙與奔走中墮落
          如何通過SOAP發送二進制數據?

          只要web services需要發送/接受二進制數據就會遇到。解決辦法也很直接:或者把二進制數據通過Base64轉到文本,或者通過附件的方式發送。

          Base64方式比較簡單易用,但是生成的文本對應二進制數據體積有三成以上的膨脹。發送很小二進制數據的時候可以應用,因為簡單,數據體積一般也不會超出可接受范圍。

          SOAP with Attachments是另一種方式,很類似發送email的附件。這種做法有效而標準,不過它在設計上有個缺陷,附件并不作為SOAP消息的一部分被發送,類似在SOAP消息里面傳個二進制數據的URL,然后通過這URL得到對應的二進制數據。這可在互操作性上有些問題,比如和WS-Security協作時可能控制不到外部的二進制數據。

          MTOM(Message Transmission Optimization Mechanism)是在SOAP with Attachment之后一種更好的解決方案。它通過XOP(XML-binary Optimized Packaging)方式來實現二進制數據的傳輸。XOP也是將二進制數據放在XML文檔外面,但它通過在XML文檔中添加XOP:include元素告訴XML處理器使用二進制數據替換特定的內容,這樣就使得二進制數據的處理方式與文本數據的處理方式一致。

          下面的代碼片段是簡單的用法示例片段:
          Server端代碼:
                  OMFactory messageFactory = OMAbstractFactory.getOMFactory();
                  OMNamespace ns 
          = messageFactory.createOMNamespace("urn:foo" , "foo");
                  OMElement binEle 
          = messageFactory.createOMElement("payload",ns);
                  File att 
          = new File("someBinaryData");
                  log.info(
          "is attachement exist? = " + att.exists());
                  FileDataSource src 
          = new FileDataSource(att);
                  DataHandler handler 
          = new DataHandler(src);
                  OMText textNode 
          = messageFactory.createOMText(handler, true);
                  binEle.addChild(textNode);
                  element.addChild(binEle);
              如果要禁用MTOM,只要在對應節點加上
                  textNode.setOptimize(false);
              就可以了,Axis2將使用Base64編碼來處理二進制數據。
                 
          Client代碼:                   
              設置客戶端支持MTOM:
                  ServiceClient wsClient = new ServiceClient();
                  Options clientOptions 
          = new Options();
                  clientOptions.setTo(
          new EndpointReference("http://some/service"));
                  clientOptions.setAction(
          "foo");
                  clientOptions.setProperty(Constants.Configuration.ENABLE_MTOM, Constants.VALUE_TRUE); 
          // enable MTOM
                  wsClient.setOptions(clientOptions);
              取得二進制數據的方法
                  OMElement dataElement = result.getFirstChildWithName(new QName("urn:foo""payload"));
                  OMText dataNode 
          = (OMText) dataElement.getFirstOMChild();
                  DataHandler handler 
          = (DataHandler) dataNode.getDataHandler();
                  InputStream is 
          = handler.getDataSource().getInputStream();
              Client通過MTOM傳輸二進制數據到Server端的方法與Server端類似,只不過是把帶有二進制數據的節點添加到要發送出去的OMElement上。

          Axis2配置
              在axis2.xml里面修改enableMTOM為true,默認是false。
              <parameter name="enableMTOM">true</parameter>


          注:在應用MTOM傳輸二進制數據時,可以注意到HTTP頭里面的消息類型是messageType=application/xop+xml。



          posted on 2007-12-20 00:09 竹十一 閱讀(3034) 評論(0)  編輯  收藏 所屬分類: SOA
           
          主站蜘蛛池模板: 湖北省| 青铜峡市| 海城市| 黄梅县| 乌苏市| 微博| 富平县| 于田县| 乐昌市| 洛阳市| 绥化市| 都江堰市| 林周县| 高唐县| 崇文区| 兴业县| 盐山县| 盐边县| 台南县| 池州市| 蒲城县| 锦州市| 尉氏县| 郁南县| 镇沅| 汽车| 库伦旗| 庆元县| 修水县| 东山县| 星子县| 宁德市| 合肥市| 黑龙江省| 绥宁县| 望奎县| 河间市| 外汇| 黔西县| 巩义市| 大连市|