2016-05-11 20 views
0

我試圖通過https使用JAX-WS調用webservice(用C#開發)。我已經嘗試通過SoapUI設置調用,並且這可以工作。與https url的Jax-ws結束爲http

但是,當試圖通過生成的jax-ws客戶端執行相同的操作時,我所得到的只是301迴應。這與我使用帶有http url的SoapUI到相同的服務相似,而wireshark也告訴我,我執行HTTP(HTTP/XML)POST操作。這使我相信,出於某種原因,我生成的JAX-WS客戶端試圖通過http而不是https調用。

Examplified代碼:

new MyServiceInterface(new URL("https://acme.com/services/MyService.svc?wsdl")) 
         .getMyPort().test(); 

正如你所看到的,我創建我的客戶時提供一個https網址。還有什麼需要確保JAX-WS使用https?命名空間的URI都是http,這會導致問題嗎?

更新:

我已經實現了使用指南,從公認的答案在這裏quesiton該服務的SOAP請求:Working Soap client example 差不多多次從了SoapUI的信息,現在它給了我一個適當的200響應。

更新2:

調試時我的JAX-WS客戶端,我發現這個屬性:

"javax.xml.ws.service.endpoint.address" -> "http://acme.com/services/MyService.svc" 

這有HTTP,HTTPS沒有。有關?

更新3:

當使用調試器 「javax.xml.ws.service.endpoint.address」 更改爲HTTPS URL,而不是HTTP,我的客戶端工作。但爲什麼它是以http開頭的?

+0

看起來像在服務器端的問題。試試如果你可以在端口443訪問服務器。 – Stefan

+0

由於SoaPUI的工作原理,我認爲服務器也可以工作嗎? – Tobb

回答

4

一個原因可能是WSDL引用了http URL。

新MyServiceInterface(新 URL( 「https://acme.com/services/MyService.svc?wsdl」)) .getMyPort()試驗(+)。

我建議下載https://acme.com/services/MyService.svc?wsdl並看看<address><service>內的終點。如果它看起來像這樣:

<soap:address location="http://acme.com/services/MyService.svc"/> 

這可以解釋你所看到的javax.xml.ws.service.endpoint.address什麼。

如果是這樣的話,你無法控制/修復遠程WSDL,您可能需要以編程方式覆蓋端點:

MyServicePort myPort = new MyServiceInterface(new URL("https://acme.com/services/MyService.svc?wsdl")).getMyPort(); 
// set endpoint to use https 
String endpointURL = "https://acme.com/services/MyService.svc"; 
BindingProvider bp = (BindingProvider) myPort; 
bp.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL); 
myPort.test(); 
+0

我會檢查出來,作爲一個側面說明,我通過手動設置屬性來實現它。只是爲了解決下一個問題(當然),用jax-b生成錯誤名稱的xml。嗯,作爲開發人員的生活:p – Tobb

+0

檢查了WSDL,並且你是正確的,service-element中的地址元素有一個http URL。這可以稱爲一個錯誤?或者僅僅是在.NET創建的wsdls中做了些什麼? – Tobb