2

Visual Studio 2010で、WSDLを使用してプロキシクラスを自動作成するWebサービスを使用するクライアントを作成しました。開発環境では、この環境で認証する必要がないため、問題なく機能しています。

私が抱えている問題は、サービスがテストおよび実稼働(実際の動作)環境で認証されていることです。WSDLはそれを記述していません。どちらも同じ開発環境のWSDLを使用しています。

テスト環境でブラウザを使用してWSDLを表示しようとすると、エンドポイントアドレスの後に「?WSDL」を付けても、開発環境のようにWSDLが返されません。認証フォームと通常のhtmlを返し、ユーザーとパスワードを通知した後、WSDLを返します(開発環境と同じ)。

app.configバインディング構成を次のように作成しました。

<wsHttpBinding>
          <binding name="WebServiceSoapAuth" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="true" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"  maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Mtom" textEncoding="utf-8"  useDefaultWebProxy="true">
            <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
            <security mode="None">
              <transport clientCredentialType="Basic" proxyCredentialType="None" realm=""/>
              <message clientCredentialType="UserName" algorithmSuite="Default"/>
            </security>
          </binding>  
        </wsHttpBinding>

VS 2010によって自動的に作成された(開発環境で動作する)basicHttpBindingを使用すると、サービスコンシューマーは、期待どおりに「セキュリティトークンを認証または承認できませんでした」と返します。

wsHttpBinding(上記のコード)に変更すると、「応答メッセージのコンテンツタイプtext / html; charset = utf-8がバインディングのコンテンツタイプ(application / soap + xml; charset = utf-8)と一致しません。カスタムエンコーダーを使用する場合は、IsContentTypeSupportedメソッドが正しく実装されていることを確認してください。応答の最初の1024バイトは、「」の後にフォーム認証のhtmlコードが続きます。

使用する必要のあるバインディング構成がわかりません。

SoapUIを使用してサービスの消費をテストし、両方の環境で機能します。認証を使用して機能するには、ユーザーとパスワードを通知するだけで、「WSS-PasswordType」リクエスト構成を「PasswordText」(ユーザーのみに通知)に変更する必要がありました。とパスワード私は「セキュリティトークンを認証または承認できませんでした」というリターンがあります)。

私の悪い英語については申し訳ありません、私は流暢ではありません、そして私が質問のカテゴリーまたはそれをフォーマットすることでいくつかの間違いをしたならば。

編集:認証のある環境でwsdlファイルを視覚化できません。アドレスの後に?WSDLを入力すると、wsdlではなく、認証用のフォーム(Ensemble InterSystemsソフトウェアのフォーム)が表示されます。

SoapUIを使用してサービスの消費をテストし、両方の環境で機能します。認証を使用して機能するには、ユーザーとパスワードを通知するだけで、「WSS-PasswordType」リクエスト構成を「PasswordText」(ユーザーのみに通知)に変更する必要がありました。とパスワード私は「セキュリティトークンを認証または承認できませんでした」というリターンがあります)。

自動生成されたクラスを使用して機能せず、ユーザーに通知して渡すだけで機能しないのはなぜですか?誰かが考えを持っていますか?SoapUI構成の「WSS-PasswordType」が「PasswordText」に等しいバインディング構成はどれですか?(これが、ユーザーとパスワードを通知するだけでは機能しない理由の鍵だと思います)

編集2:石鹸メッセージの本文は大丈夫です。ヘッダーの作成に問題があります。それは次のようなものかもしれません:

<soapenv:Header> <wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken wsu:Id="UsernameToken-5"> <wsse:Username>USERNAME</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASSWORD</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">E1XqZ2v8IDaTBzfF3j/TOA==</wsse:Nonce> <wsu:Created>2012-12-21T12:24:23.380Z</wsu:Created> </wsse:UsernameToken> </wsse:Security> </soapenv:Header>

私が言ったように、私はサーバーにアクセスできません、それは私の顧客にあります。私はそれがJavaで作られていることを知っています。

4

2 に答える 2

1

まず、クライアントがサーバーと同じバインディングを使用していることを確認する必要があります。たとえば、クライアントがwsHttpBindingを使用しているが、basicHttpBindingを使用するサービスを指している場合、ほとんどの場合、問題が発生します。

次に、セキュリティモードをnoneに設定します。これは、トランスポートまたはメッセージセキュリティを使用しないことを意味し、それが必要なことではないと思います。使用したい場合

<transport clientCredentialType="Basic" proxyCredentialType="None" realm=""/>

<message clientCredentialType="UserName" algorithmSuite="Default"/>

次に、セキュリティモードをTransportWithMessageCredentialに設定する必要があります。これは、HTTPSにトランスポートセキュリティを使用し、認証にメッセージセキュリティを使用します。他のセキュリティモードは、clientCredentialTypeの1つのみを使用します(トランスポートはトランスポートclientCredentialTypeを使用し、メッセージはメッセージclientCredentialTypeを使用します)。

お役に立てれば :)。

于 2012-12-14T18:14:06.950 に答える
0

http webrequestを手動で作成し、xmlを手動で作成してrequestに渡す必要がありました。postData変数は、手動で作成されたxmlから取得されます。

    Dim byteArray As Byte() = Encoding.UTF8.GetBytes(postData)
    Dim req As HttpWebRequest = DirectCast(WebRequest.Create("http://site.customer/ens/qa/customer.bs.ws.service.cls"), HttpWebRequest)
    req.Method() = "POST"
    req.UserAgent = "Apache-HttpClient/4.1.1 (java 1.5)"
    req.ContentType = "text/xml;charset=UTF-8"
    req.ContentLength = byteArray.Length
    req.KeepAlive = True
    req.Host = "site.customer"
    req.AutomaticDecompression = 3
    req.Headers.Add("SOAPAction", "http://www.tempuri.org/customer.bs.ws.service.function")
于 2013-01-04T16:54:15.737 に答える