0
我試圖從使用JAX-WS和Metro庫的Java客戶端使用WCF Web服務。我已經成功使用wsimport生成客戶端,並且可以與服務器打開會話,但是服務返回的會話令牌沒有被設置到Java的響應對象中。當我將一個空字符串傳遞給endSession時,服務會返回一個錯誤,endSession會在需要SessionToken時發送沒有正文內容的消息。Metro客戶端使用WCF wsdl,未設置響應對象的屬性
這是我的主要()「方法
public static void main(String[] args) {
MyService service = new MyService()
MyPort port = service.getBasicHttpBinding();
EmulateRequest request = new EmulateRequest();
request.setUnimportantProperties();
SessionTokenResponse session = port.beginSessionAndEmulate(request);
port.endSession(session.getSessionToken());
}
的要點,我得到的錯誤是,sessionToken在會話對象爲空。我確定sessionToken從未設置。我無法步入beginSession方法,因爲端口是動態生成的代理。
我發送的請求是這樣的:
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<EmulateRequest xmlns="http://My.Namespace">
<UnimportantProperties>XXXX</UnimportantProperties>
</EmulateRequest>
</S:Body>
</S:Envelope>
我收到的反應是這樣的:
<?xml version='1.0' encoding='UTF-8'?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<o:Security xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:mustUnderstand="1">
<u:Timestamp u:Id="_0">
<u:Created>2011-09-30T17:49:38.570Z</u:Created>
<u:Expires>2011-09-30T17:54:38.570Z</u:Expires>
</u:Timestamp>
</o:Security>
</s:Header>
<s:Body>
<SessionTokenResponse>
<Errors />
<Messages />
<Warnings />
<SessionToken>e579dd3e-34df-4396-ae42-1ebf03c9f301</SessionToken>
</SessionTokenResponse>
</s:Body>
</s:Envelope>
在WSDL,我SessionTokenResponse對象定義如下:
xmlns:tns="http:\\MyNamespace"
<wsdl:types>
<xs:complexType name="SessionTokenResponse">
<xs:complexContent>
<xs:extension base="Response">
<xs:sequence>
<xs:element name="SessionToken" type="xs:string" minOccurs="0"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="Response">
<xs:sequence>
<xs:element name="Errors">
<xs:complexType>
<xs:sequence>
<xs:element name="Error" minOccurs="0" maxOccurs="unbounded" type="Error"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Messages">
<xs:complexType>
<xs:sequence>
<xs:element name="Message" minOccurs="0" maxOccurs="unbounded" type="Message"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Warnings">
<xs:complexType>
<xs:sequence>
<xs:element name="Warning" minOccurs="0" maxOccurs="unbounded" type="Warning"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</wsdl:types>
<wsdl:message name="EmulateRequestMessage">
<wsdl:part name="EmulateRequest" element="tns:EmulateRequest"/>
</wsdl:message>
<wsdl:message name="SessionTokenResponseMessage">
<wsdl:part name="SessionTokenResponse" element="tns:SessionTokenResponse"/>
</wsdl:message>
<wsdl:portType msc:usingSession="false" name="MyPortName">
<wsdl:operation name="BeginSessionAndEmulate">
<wsdl:input wsaw:Action="http://MyNamespace/BeginSessionAndEmulate" name="EmulateRequestMessage" message="tns:EmulateRequestMessage"/>
<wsdl:output wsaw:Action="http://MyNamespace/BeginSessionAndEmulateResponse" name="SessionTokenResponseMessage" message="tns:SessionTokenResponseMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="BasicHttpBinding" type="tns:MyBindingName">
<wsdl:operation name="BeginSessionAndEmulate">
<wsp:PolicyReference URI="#BasicHttpBinding_policy"/>
<wsdl:input name="EmulateRequestMessage">
<soap:body use="literal" parts="EmulateRequest"/>
</wsdl:input>
<wsdl:output name="SessionTokenResponseMessage">
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="MyService">
<wsdl:port name="BasicHttpBinding" binding="tns:BasicHttpBinding">
<soap:address location="https://MyServiceLocation"/>
</wsdl:port>
</wsdl:service>
/** Generated by WsImport *************************************/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SessionTokenResponse", propOrder = {
"sessionToken"
})
public class SessionTokenResponse
extends Response
{
@XmlElement(name = "SessionToken")
public String sessionToken;
public String getSessionToken() {
return sessionToken;
}
public void setSessionToken(String value) {
this.sessionToken = value;
}
}
Th當然是其他操作,但我只公佈了相關操作和類型。
有沒有人有地鐵足夠的經驗告訴我,我忘了哪個愚蠢的設置? 謝謝