6

我有一个由 WCF 客户端和 Java 使用的 WCF Web 服务。.net 客户端工作正常,但 java 客户端无法通信并引发以下错误。

<s:Fault>
  <faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none" xmlns="">a:ActionNotSupported</faultcode>
  <faultstring xml:lang="en-US" xmlns="">The message with Action '' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver.  Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).</faultstring>
</s:Fault>

我已经捕获了这两个请求,但无法找出实际问题。

这是 .net 客户端发送的请求。

<MessageLogTraceRecord>
  <HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
    <Method>POST</Method>
    <QueryString></QueryString>
    <WebHeaders>
      <Connection>Keep-Alive</Connection>
      <Content-Length>277</Content-Length>
      <Content-Type>text/xml; charset=utf-8</Content-Type>
      <Expect>100-continue</Expect>
      <Host>devint</Host>
      <VsDebuggerCausalityData>uIDPoz4EUGTdY91Co1FESc2IENsAAAAAfpHU4m1Iok+wSxmrwkiWZ9iNzD51RjZMnpnEBbceBDcACQAA</VsDebuggerCausalityData>
      <SOAPAction>"http://tempuri.org/Test/IsPilotUser"</SOAPAction>
      <X-Forwarded-For>xx.xxx.xxx.xxx</X-Forwarded-For>
      <X-Optier-Context-Address>43143760</X-Optier-Context-Address>
    </WebHeaders>
  </HttpRequest>
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
      <To s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://service url here</To>
      <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/Test/IsPilotUser</Action>
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <IsPilotUser xmlns="http://tempuri.org/">
        <UserID>AA</UserID>
      </IsPilotUser>
    </s:Body>
  </s:Envelope>
</MessageLogTraceRecord>

以下是java客户端生成的请求-

<MessageLogTraceRecord>
  <HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
    <Method>POST</Method>
    <QueryString></QueryString>
    <WebHeaders>
      <Cache-Control>no-cache</Cache-Control>
      <Connection>keep-alive</Connection>
      <Pragma>no-cache</Pragma>
      <Content-Length>1414</Content-Length>
      <Content-Type>text/xml; charset=utf-8</Content-Type>
      <Accept>text/xml, text/html, image/gif, image/jpeg, *; q=.2, * / *; q=.2</Accept>
      <Host>devint</Host>
      <User-Agent>Java/1.6.0_25</User-Agent>
      <SOAPAction>""</SOAPAction>
      <X-Optier-Context-Address>43526520</X-Optier-Context-Address>
    </WebHeaders>
  </HttpRequest>
  <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header xmlns:hdr="http://xml.example.com/ns/appmw/soap/1.0/header">
      <hdr:RequestID xmlns:hdr="http://xml.example.com/ns/appmw/soap/1.0/header">287933.1372254929205.341301</hdr:RequestID>
      <hdr:Timestamp xmlns:hdr="http://xml.example.com/ns/appmw/soap/1.0/header">1372254929205</hdr:Timestamp>
      <hdr:Principal xmlns:hdr="http://xml.example.com/ns/appmw/soap/1.0/header">
        <saml:Assertion xmlns:saml="http://xml.example.com/ns/appmw/soap/1.0/saml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" Issuer="PingFederate SiteMinder SOAP Connector" xsi:type="saml:AuthenticationAssertionType">
          <saml:Subject>
            <saml:NameIdentifier>
              <saml:SecurityDomain>KerberosID</saml:SecurityDomain>
              <saml:Name>None</saml:Name>
            </saml:NameIdentifier>
            <saml:SubjectConfirmation>
              <saml:AuthenticationMethod>Netegrity</saml:AuthenticationMethod>
              <saml:SubjectConfirmationData>None</saml:SubjectConfirmationData>
            </saml:SubjectConfirmation>
          </saml:Subject>
        </saml:Assertion>
      </hdr:Principal>
      <To SOAP-ENV:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://service url here</To>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
      <pf:AttributesRequest xmlns:pf="http://xml.ms.com/ns/webinfra/pingfederate/sso-attributes">
        <pf:Data>
          <pf:HumanNo></pf:HumanNo>
          <pf:Originator>None</pf:Originator>
          <pf:UniqueID>None</pf:UniqueID>
        </pf:Data>
        <pf:Attribute>
          <pf:Name>IsPilotUserResult</pf:Name>
        </pf:Attribute>
      </pf:AttributesRequest>
    </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
</MessageLogTraceRecord>

我不熟悉Java,所以任何帮助将不胜感激。

4

1 回答 1

5

您的 java 客户端发送此 http 标头:

SOAPAction=""

而.Net发送这个:

SOAPAction="http://tempuri.org/Test/IsPilotUser"

强制 java 客户端发送正确的值。

于 2013-06-26T17:21:21.290 回答