WCT REST サービスを公開しようとしていますが、有効なユーザー名とパスワードを持つユーザーのみがアクセスできます。ユーザー名とパスワードは SQL データベースに保存されます。
サービス契約は次のとおりです。
public interface IDataService
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
byte[] GetData(double startTime, double endTime);
}
WCF 構成は次のとおりです。
<bindings>
<webHttpBinding>
<binding name="SecureBinding">
<security mode="Transport">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="DataServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType=
"CustomValidator, WCFHost" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="DataServiceBehavior" name="DataService">
<endpoint address="" binding="webHttpBinding"
bindingConfiguration="SecureBinding" contract="IDataService" />
</service>
</services>
Silverlight アプリケーション内の WebClient クラスを介してサービスにアクセスしています。ただし、ユーザー資格情報をサービスに渡す方法を理解できませんでした。client.Credentials のさまざまな値を試しましたが、カスタム バリデーターでコードをトリガーするものはないようです。次のエラーが表示されます: 基になる接続が閉じられました: 送信時に予期しないエラーが発生しました。
ここに私が試したいくつかのサンプルコードがあります:
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("name", "password", "domain");
client.OpenReadCompleted += new OpenReadCompletedEventHandler(GetData);
client.OpenReadAsync(new Uri(uriString));
セキュリティ モードを [なし] に設定すると、すべてが機能します。他の clientCredentialType 値も試しましたが、どれも機能しませんでした。また、サービスがチャンスを得る前に IIS がユーザーを認証しようとすることに関連する問題を排除するために、WCF サービスを自己ホストしました。
根本的な問題が何であるかについてのコメントは大歓迎です。ありがとう。
更新: Mehmet の優れた提案に感謝します。これが私が持っていたトレース構成です:
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.IdentityModel" switchValue="Information,
ActivityTracing" propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\Traces.svclog" />
</sharedListeners>
</system.diagnostics>
しかし、Silverlight クライアントからのメッセージは表示されませんでした。https と http については、次のように https を使用しました。
string baseAddress = "https://localhost:6600/";
_webServiceHost = new WebServiceHost(typeof(DataServices),
new Uri(baseAddress));
_webServiceHost.Open();
ただし、SSL 証明書は構成しませんでした。これが問題ですか?