最近作個項目,biztalk跟OTM(Oracle Transportation Management)系統作對接,雙方經過web services通信,這部分是BizTalk調用OTM的web services。java
OTM的雲服務,僅支持WS-Security的Username Token驗證方式。web
因此須要使用UsernameToken Web Service Security Policy,並使用HTTPS加密此SOAP消息的傳輸。安全
OTM發佈的web services是基於java的,也就是說這也是個biztalk調用的java開發的基於WS-Security的web services的例子。oracle
https的請求內容格式以下:app
POST https://URL HTTP/1.1 工具
Content-Type: text/xml; charset=utf-8 測試
SOAPAction: "process" 加密
Host: host spa
Content-Length: 6115 3d
Expect: 100-continue
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<env:Header>
<ns1:Security>
<ns1:UsernameToken>
<ns1:Username>GUEST.ADMIN</ns1:Username>
<ns1:Password>CHANGEME</ns1:Password>
</ns1:UsernameToken>
</ns1:Security>
</env:Header>
<env:Body>
...your message content goes here...
</env:Body>
</env:Envelope>
在VS的BizTalk project中使用ADDàAdd Generated Items… à Consume WCF Service:
引用OTM的web services提供的wsdl URL:
WSDL包括相應的xsd文件可以獲取到,點擊下一步就會出錯:
試過N屢次,在這一步死活就是過不去,引用不成功,只能理解爲雙方兼容性問題。
引用在線的wsdl不成功,就試試引用wsdl文件。使用svcutil.exe工具根據web
Services提供的wsdl的URL生成wsdl和相應的xsd文件:
能夠看到生成了兩個文件:xmlns.oracle.com.apps.otm.IntXmlService.wsdl和xmlns.oracle.com.apps.otm.xsd,這就是biztalk引用文件wsdl的原料了。
再在VS的BizTalk project中使用ADDàAdd Generated Items… à Consume WCF Service,此次選Metadata File:
下一步:
選擇前面生成的兩個文件,一個wsdl文件,一個xsd文件。結果仍是出錯:
把wsdl文件和xsd合併成一個文件再試。
查看wsdl文件以下:
把xmlns.oracle.com.apps.otm.xsd的內容整個的替換掉紅框內的內容,把兩個文件合併爲一個wsdl文件,在bizitalk project再次引用成功,生成三個文件:
部署這個BizTalk項目後,在biztalk application中導入端口的綁定文件:IntXmlService.BindingInfo.xml,能夠看到這是一個WCF-Custom發送端口:
點擊這個端口的"Configure…":
Bingding標籤的內容:
設置好對方提供的用戶名和密碼:
設置一個接收端口從一個文件夾接收測試文件,這個發送端口設置Filter訂閱這個接收端口,而後再設置一個發送端口訂閱這個發送端口返回的消息寫到一個文件夾,這個具體過程就不詳細描述了。
開始測試,將一個從xsd schema生成的消息實例發送給對方,使用Fiddler截取發送和返回的消息看。
截取到的發送出去的消息是這樣的:
截取到的返回的消息是這樣的:
很明顯,對方返回的消息說安全驗證錯誤。
查看發送出去的消息裏面,發如今Envelope裏沒有Header,就沒有把Username Token發送給對方。
仔細檢查WCF-Custom發送端口的配置,發現缺乏Security的配置。
在發送端口的Binding標籤中增長Security Extension:
把security移到最上面的位置,而後設置authenticationMode爲UserNameOverTransport,把enableUnsecuredResponse設置爲True。
再測試,使用Fiddler截取發送和返回的消息看。
截取到的發送出去的消息是這樣的:
能夠看到,Envelope中的Header有了,UsernameToken也有了。
截取到的返回的消息是這樣的:
能夠看到,這個就是對方的正常回應消息了。