私はこれで髪を引き裂いています。ブラウザから呼び出すことができる WCF サービスがあり、正常に動作します。以下のメソッドを使用して Web アプリケーションから呼び出すと、(401) Unauthorizedエラーが発生します。そして、サービスは呼び出されません。さらに、開発サーバー (IIS7) を指すローカル マシン (IIS Express を使用したデバッグ モード) から Web アプリケーションを実行すると動作しますが、Web アプリケーションを開発サーバーにデプロイして開発サーバー サービスを指すと、 401 エラーで失敗します。これは IIS7 に関係していると思いますが、100% 確信があるわけではなく、ヘルプがあれば非常に便利です。
私は答えをオンラインで探しましたが、これまでのところ私が見つけた最高のものはこれです。
私のサービスコールは次のとおりです。
var request = (HttpWebRequest) WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/json; charset=utf-8";
request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
request.Credentials = CredentialCache.DefaultCredentials;
WebResponse responce = request.GetResponse();
Stream reader = responce.GetResponseStream();
var sReader = new StreamReader(reader);
string outResult = sReader.ReadToEnd();
sReader.Close();
var result = (T) JsonConvert.DeserializeObject(outResult, typeof (T));
return result;
サービスの構成は次のようになります。
<service name="RGMPServices.Householding.Services.AccountService" behaviorConfiguration="Default">
<endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IAccountService" />
</service>
<service name="RGMPServices.Householding.Services.HouseholdService" behaviorConfiguration="Default">
<endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IHouseholdService" />
</service>
<service name="RGMPServices.Householding.Services.UserService" behaviorConfiguration="Default">
<endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IUserService" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webBehaviour">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="Default">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="SecuredHttpEndpointBinding" helpEnabled="true" automaticFormatSelectionEnabled="true">
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</standardEndpoint>
</webHttpEndpoint>
</standardEndpoints>
サービスを呼び出す直前に、クライアント サービス呼び出しにログを記録しました。応答は次のとおりです。
DEBUG 2013-10-01 13:15:13,569 452ms ServiceGetSingle - ログインの受け渡し: MYLANDOMAIN\MYLANUSERNAME
ERROR 2013-10-01 13:15:13,631 514ms ServiceGetSingle - ユーザー資格情報ログインで ServiceGetSingle を呼び出すエラー: MYLANDOMAIN\MYLANUSERNAME System.Net.WebException: リモート サーバーがエラーを返しました: (401) 権限がありません。System.Net.HttpWebRequest.GetResponse() で Householding.Common.ServiceHelper.ServiceGetSingle[T](String url) で
コードは次のようになります。
logger.Debug("Passing Login: "
+ System.Security.Principal.WindowsIdentity.GetCurrent().Name)
Web サイトの AppPool をドメイン アカウントに設定しても、WCF サービスへのアクセスはまだ許可されていませんが、ブラウザでは機能しています。とても奇妙!