2011-09-30 20 views
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當然是其他操作,但我只公佈了相關操作和類型。

有沒有人有地鐵足夠的經驗告訴我,我忘了哪個愚蠢的設置? 謝謝

回答

0

已修復,Web服務沒有在響應中提供名稱空間信息。當響應看起來像下面那麼它工作正常:

<SessionTokenResponse xmlns="http://My.Namespace"> 
    <Errors /> 
    <Messages /> 
    <Warnings /> 
    <SessionToken>e579dd3e-34df-4396-ae42-1ebf03c9f301</SessionToken> 
</SessionTokenResponse>