Я довольно новичок в WCF и пытаюсь создать службу WCF с пользовательским именем пользователя и паролем. Я знаю, что я должен установить имя пользователя и пароль для ClientCredentials прокси, но по какой-то причине у меня нет такого свойства ...Свойство CreateChannel с ClientCredentials
Я предполагаю, что это имеет какое-то отношение к моему Контракту, так что вот оно:
Мой код контракта:
namespace Contracts
{
[ServiceContract]
public interface ICalc
{
[OperationContract]
CalcResponse Add(double x, double y);
[OperationContract]
CalcResponse Substract(double x, double y);
[OperationContract]
CalcResponse Multiply(double x, double y);
[OperationContract]
CalcResponse Divide(double x, double y);
}
}
в моем клиенте все, что я пытаюсь сделать, это:
ChannelFactory<ICalc> channel = new ChannelFactory<ICalc>("calcEndpoint");
ICalc proxy = channel.CreateChannel();
proxy.ClientCredentials.UserName.UserName = "USER";
proxy.ClientCredentials.UserName.Password = "PASSWORD";
Но мой прокси doen't имеют свойство ClientCredentials
Обновление: У меня возникли некоторые проблемы, вызывающие некоторые другие ошибки. Когда я их решил, у меня возникла новая ошибка:
The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue.
Мой тайм-аут 5 установлен на 5 минут как на клиенте, так и на сервере. Я получаю эту ошибку после того, как менее чем за минуту ...
Вот мой обновленный код:
ChannelFactory<ICalc> channel = new ChannelFactory<ICalc>("calcEndpoint");
var defaultCredentials = channel.Endpoint.Behaviors.Find<ClientCredentials>();
channel.Endpoint.Behaviors.Remove(defaultCredentials);
ClientCredentials loginCredentials = new ClientCredentials();
loginCredentials.UserName.UserName = "Comply";
loginCredentials.UserName.Password = "123456";
channel.Endpoint.Behaviors.Add(loginCredentials);
ICalc proxy = channel.CreateChannel();
У меня есть пользовательский валидатор, я поставил точку останова, но она просто не сделать его там. .. Мой код валидатор:
class CustomUserNameValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (userName == "comply" && password == "123456")
{
}
}
}
Конфиг (на клиенте и сервере):
<service name ="WcfServiceLibrary.Service1" behaviorConfiguration ="CustomValidator">
<host>
<baseAddresses>
<add baseAddress="http://localhost/CalcIISHost/mex"/>
<add baseAddress ="net.tcp://localhost:808/CalcIISHost/CalcService"/>
</baseAddresses>
</host>
<endpoint address ="" binding ="netTcpBinding" bindingConfiguration="tcpWithMessageSecurity" contract ="Contracts.ICalc"></endpoint>
<endpoint address ="net.tcp://localhost:5001/CalcIISHost/mex" binding ="mexTcpBinding" contract ="IMetadataExchange"></endpoint>
</service>
...
<behavior name="CustomValidator">
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="WCFClasses.CustomUserNameValidator, WCFClasses"/>
<serviceCertificate
findValue="localhost"
x509FindType="FindBySubjectName"
storeLocation="CurrentUser"
storeName="My" />
</serviceCredentials>
<serviceMetadata httpGetEnabled ="true"/>
</behavior>
...
<netTcpBinding>
<binding name="tcpWithMessageSecurity" sendTimeout="00:05:00" receiveTimeout="00:05:00">
<security mode="Message" >
<message clientCredentialType="UserName"/>
</security>
</binding>
</netTcpBinding>
Любые идеи, что я сделал неправильно?
Спасибо! Кажется, это сработало! :) –
Ой, боюсь, на самом деле это не работает ... Теперь я получаю сообщение об ошибке как обновленное в вопросе ... –
Я считаю, что сообщение об ошибке не связано с передачей учетных данных, я предлагаю вам отслеживать ошибку сообщение. –