0

組み込みの WCF サービス ホストと、Visual Studio 2008 の組み込み開発 Web サーバーによるホスティングで動作する小さな WCF Web サービスがあります。

これらのホスティング環境では、サービス メソッドを呼び出すために WCF テスト クライアントに依存しています。

現在、次のテスト段階で問題が発生しています。

WinXP 開発マシンの IIS 5.1 でホストしていますが、おそらく問題は、WCF テスト クライアントを使い続けることができないことだと思います。何が起こっているかは次のとおりです。

ケース 1: 「匿名アクセス」がチェックされている (有効)

WCF テスト クライアント UI が適切に表示され、WebMethods と [INVOKE] ボタンが表示されます。しかし、INVOKE をクリックすると、Windows 認証を必要とするバックエンド データ ストア (サード パーティ製品) に接続できません。product.DLL から返されたエラーを投稿できますが、関連性はないと思います。

ケース 2: 「匿名アクセス」がチェックされていない (無効)

WCF テスト クライアント UI は、正しく初期化することさえできません。これを調査したところ、MEX (WS-Metadata Exchange) には「匿名アクセス」が必要であり、(明らかに) WCF テスト クライアントには MEX が必要であることがわかりました。返されるエラーの主なスニペットを次に示します。

Error: Cannot obtain Metadata from http://localhost/wcfiishost
The remote server returned an error: (401) Unauthorized.HTTP GET Error
URI: http://localhost/wcfiishost    
There was an error downloading 'http://localhost/wcfiishost'.    
The request failed with the error message:
Security settings for this service require 'Anonymous' Authentication but it is not enabled for the IIS application that hosts this service

バインディング オプション、メッセージ セキュリティなどの説明がたくさんあり、正直に言って理解できません。以下は私の見解ですが、皆様のご意見をお待ちしております。

(a) Windows 認証を使用するように WCF Web サービスを構成する必要があることを知っているため、IIS でサービスをホストしている場合、WCF テスト クライアントを引き続き使用することはできないと判断しました。それが私にとって有用であるよりも効果的に長生きしたこと。Anonymous なしでは WCFTestClient は機能しないため、時間をかけて Web クライアントを作成する必要があります。

(また)

(b) WCF テスト クライアントとホステッド サービスが適切に構成されていれば、それを使用することができます (このための特別な構成手法が何であるかはわかりません)。

どちらが正しい?WCFTestClient の使用をやめる時が来ましたか、それとも両方の方法で使用する方法はありますか? アドバイスをいただきありがとうございます。

編集: 2009 年 6 月 11 日

他の誰かがこの質問について私を助けるために私が提供できるものは他にありますか?

4

3 に答える 3

0

私はちょうど同じ設定をしようとしましたが、私の場合、すべてがうまく機能しているようです.

  • ASP.NET Web サイト
  • 特別な設定をまったく行わずにbasicHttpBindingを使用するWCFサービス
  • 匿名 = 有効および Windows 認証 = 有効 (両方とも有効) の IIS アプリケーション

WcfTestClient を使用して簡単に接続し、メタデータを取得して、問題なく呼び出すことができます。

サービス関数内で、現在のユーザーが既知のユーザーであるかどうかを確認します。これは、Windows 認証ユーザーとして正しく識別されます。

    ServiceSecurityContext ssc = ServiceSecurityContext.Current;

    if (ssc.IsAnonymous)
    {
        return "anonymous user";
    }
    else
    {
        if(ssc.WindowsIdentity != null)
        {
            return ssc.WindowsIdentity.Name;
        }

        if (ssc.PrimaryIdentity != null)
        {
            return ssc.PrimaryIdentity.Name;
        }
    }

    return "(no known user)";

他に何を確認すればよいかわかりません (ただし、IIS7 を使用する Vista を使用している場合を除きます)。このコードを含めて、サービス コードでユーザーをチェックできる可能性はありますか? 見るだけで....

マルク

于 2009-06-11T17:12:18.903 に答える
0

この質問のタイトル/件名を設定し、ここで行き止まりに達したとき、MSDNフォーラムで同じ問題を開き、タイトルを強調しました(質問の内容は本質的に同じです)。

私にとっての本当の問題は、匿名認証を設定せずにIISでWCFTestClientを使用する方法でした(私のサービスには統合Windows認証のみが必要だったため)。

Mex には Anonymous が必要なようで、デフォルトで WCFTestClient には Mex が必要なようです。キーは、web.config ファイルを慎重に修正することの両方に対応しているようです。

とにかく、以下のこのweb.configで動作するようになりました(MSDNリンクはこちらです

<?xml version="1.0"?>
<configuration>

            <endpoint address="" 
                        binding="wsHttpBinding"
                        bindingConfiguration="wsBindingConfig"
                        contract="sdkTrimFileServiceWCF.IFileService">

                                 <identity>
                                    <dns value="localhost" />
                                 </identity>
            </endpoint>

            <endpoint address="basic" 
                        binding="basicHttpBinding"
                        bindingConfiguration="bindingConfig" 
                        contract="sdkTrimFileServiceWCF.IFileService" />
        </service>
    </services>

    <bindings>
        <basicHttpBinding>
            <binding name="bindingConfig">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows"/>
                </security>
            </binding>
        </basicHttpBinding>

        <wsHttpBinding>
            <binding name="wsBindingConfig">
                <security mode="Transport">
                    <transport clientCredentialType="Windows"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>

        </serviceBehaviors>
    </behaviors>

于 2009-12-09T18:52:58.640 に答える
0

マーク、あなたのセットアップはジョンズにさえ近いものではありません。

John は、メッセージ モードのトランスポートに Windows Credentials を使用する WSHttpBinding を使用します。BasicHttpBinding で Windows 認証が使用されていません。さらに、John は AnonymousAuthentication を無効にしていたため、Metadata Exchange (mex) が失敗しています。

呼び出しを試みるとエラー 401 (Unauthorized) が発生するため、呼び出しはサービス側の関数の内部にも到達しません。

私は同じ問題を抱えており、どうにかしてエンドポイントごとに個別のバインディングを設定しようとしています。うまくいけばうまくいくでしょう。

于 2009-06-27T01:42:44.860 に答える