個別のWebアプリケーションでファイルレス.svcサービスをホストすることを担当する共通のdll(API)があります。したがって、API はさまざまな Web アプリケーションから参照されます。サービス エンドポイントとして BasicHttpBinding を使用し、セキュリティ モードとして API で「BasicHttpSecurityMode.None」を使用します。
IIS の Web アプリケーションで「匿名認証」が有効になっている場合、ファイルレス *.svc が正常にホストされ、ブラウザから呼び出してメタデータを表示できます。
一方、IIS の Web アプリケーションで「匿名認証」が無効になっており、「Windows 認証」が有効になっている場合は、次のエラーが発生します。
「ホスト ('IntegratedWindowsAuthentication') で構成された認証スキームは、バインディング 'MyService' ('Anonymous') で構成されたものを許可しません。SecurityMode が Transport または TransportCredentialOnly に設定されていることを確認してください。さらに、これは変更することで解決される場合があります。 IIS 管理ツール、ServiceHost.Authentication.AuthenticationSchemes プロパティ、要素のアプリケーション構成ファイル、バインディングの ClientCredentialType プロパティの更新、または HttpTransportBindingElement の AuthenticationScheme プロパティの調整を介して、このアプリケーションの認証スキームを変更します。」
以下のコードで問題を解決する方法を見つけました。ただし、IIS 上の Web アプリケーションの認証ステータスを知る必要があります。現在の Web アプリケーションの認証ステータスをプログラムで把握する方法が見つかりませんでした。おそらく、Web アプリケーションの web.config で、指定された認証ステータスを手動で設定できます。
web.config 設定
<appSettings>
<add key="IS_ANONYMOUS" value="True"/>
</appSettings>
Binding を作成するためのコード ブロックは次のとおりです。
public BasicHttpBinding GetBasicHttpBinding( string bindingName, bool isAnonymous ) {
BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.None;
if (!isAnonymous) {
binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly;
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
binding.Security.Transport.ProxyCredentialType = HttpProxyCredentialType.None;
binding.Security.Transport.Realm = "";
binding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;
binding.Security.Message.AlgorithmSuite = SecurityAlgorithmSuite.Default;
}
binding.Name = bindingName;
binding.MaxReceivedMessageSize = int.MaxValue;
binding.ReaderQuotas.MaxStringContentLength = int.MaxValue;
return binding;
}
サービスをホストする方法は次のとおりです。
internal static ServiceHost CreateServiceHost( Type implementedContractType, Type serviceType, Uri[] baseAddresses ) {
ServiceHost host = new ServiceHost( serviceType, baseAddresses );
BasicHttpBinding binding = GetBasicHttpBinding( serviceType.Name, false );
host.AddServiceEndpoint( implementedContractType, binding, "" );
return host;
}
私の質問は、Web アプリケーションの認証ステータスの影響を受けないようにサービス ホストを作成する方法です。Web アプリケーションの認証ステータスを認識せずに匿名でアクセスできるファイルレス .svc ファイルを作成する方法はありますか?