2014-02-19 5 views
2

Я довольно новичок в 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> 

Любые идеи, что я сделал неправильно?

ответ

3

Вы можете установить учетные данные, как это ...

Удалить поведение конечных точек по умолчанию

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 = "USER"; 
loginCredentials.UserName.Password = "PASSWORD"; 

набор учетных данных, как новое поведение конечных точек на заводе

channel.Endpoint.Behaviors.Add(loginCredentials); 
ICalc proxy = channel.CreateChannel(); 

EDIT 27 февраля

Я предлагаю добавить протоколирование к вам службы и после исключения вы получаете в вашем Error.svclog файл, добавьте ниже в теге конфигурации в app.config службы.

<system.diagnostics> 
     <sources> 
      <source name="System.ServiceModel" 
        switchValue="Information, ActivityTracing" 
        propagateActivity="true" > 
       <listeners> 
        <add name="xml"/> 
       </listeners> 
      </source> 
      <source name="System.ServiceModel.MessageLogging"> 
       <listeners> 
        <add name="xml"/> 
       </listeners> 
      </source> 
      <source name="myUserTraceSource" 
        switchValue="Information, ActivityTracing"> 
       <listeners> 
        <add name="xml"/> 
       </listeners> 
      </source> 
     </sources> 
     <sharedListeners> 
      <add name="xml" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="Error.svclog" /> 
     </sharedListeners> 
    </system.diagnostics> 
+0

Спасибо! Кажется, это сработало! :) –

+0

Ой, боюсь, на самом деле это не работает ... Теперь я получаю сообщение об ошибке как обновленное в вопросе ... –

+0

Я считаю, что сообщение об ошибке не связано с передачей учетных данных, я предлагаю вам отслеживать ошибку сообщение. –

 Смежные вопросы

  • Нет связанных вопросов^_^