Я пытаюсь открыть службу 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>
Я получаю доступ к службе через класс WebClient в приложении Silverlight. Однако я не смог выяснить, как передать учетные данные пользователя в службу. Я пробовал различные значения для client.Credentials, но, похоже, ни одно из них не вызывает код в моем пользовательском валидаторе. Я получаю следующую ошибку: Основное соединение было закрыто: при отправке произошла непредвиденная ошибка.
Вот пример кода, который я пробовал:
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("name", "password", "domain");
client.OpenReadCompleted += new OpenReadCompletedEventHandler(GetData);
client.OpenReadAsync(new Uri(uriString));
Если я установлю режим безопасности на Нет, все будет работать. Я также пробовал другие значения clientCredentialType, и ни одно из них не работало. Я также самостоятельно разместил службу WCF, чтобы устранить проблемы, связанные с попытками IIS аутентифицировать пользователя до того, как служба получит шанс.
Будем весьма благодарны за любые комментарии относительно возможных проблем. Спасибо.
Обновление : Благодаря превосходным предложениям Мехмета. Вот конфигурация трассировки, которая была у меня:
<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-сертификата. Это проблема?