2012-04-19 4 views
3

У меня есть сервис, который я хотел бы использовать свойство моего клиента:Используя свойство в WCF

[ServiceContract] 
public interface IMyAPI 
{ 
    string UserName { [OperationContract] get; [OperationContract] set; } 
    string Password { [OperationContract] get; [OperationContract] set; } 

    [OperationContract] 
    bool StockQuery(string partNo); 
} 

public class MyAPI : IMyAPI 
{ 
    public string UserName { get; set; } 
    public string Password { get; set; } 

    private void CheckSecurity() 
    { 
     if(this.UserName != "test" && this.Password != "123") 
     { 
      throw new UnauthorizedAccessException("Unauthorised"); 
     } 
    } 

    public bool StockQuery(string partNo) 
    { 
     this.CheckSecurity(); 
     if(partNo == "123456") 
     { 
      return true; 
     } 
     return false; 
    } 
} 

Тогда на моем клиенте я:

Testing.MyAPIClient client = new Testing.MyAPIClient(); 

client.set_UserName("test"); 
client.set_Password("123"); 
Console.WriteLine(client.StockQuery("123456")); 
Console.ReadLine(); 

Проблема в том, когда Я отлаживаю, UserName и Password не устанавливаются, они равны нулю.

+0

Почему 'set_UserName' и' set_Password'? Является ли код клиента еще на C#, потому что обычно вы просто выполняете 'client.UserName =" test "'. – CodingGorilla

+0

@CodingGorilla Это потому, что 'OperationContract' включен в getter и setter явно, поэтому он предоставляет метод вызова метода –

+0

. Я сомневаюсь, что вы можете« вызвать »свойство таким образом ... знать о сеансовом режиме - Это может стать грязным, как черт! –

ответ

8

по умолчанию WCF создаст новый экземпляр вашей службы для обслуживания каждого вызова (PerCall instancing), чтобы ваши наборы свойств не запомнится.

Вам необходимо передать ваши данные безопасности с помощью служебного вызова StockQuery.

[OperationContract] 
bool StockQuery(string partNo,String userName,String password); 

public bool StockQuery(string partNo,String userName,String password) 
{ 
    this.CheckSecurity(userName,password); 
    if(partNo == "123456") 
    { 
     return true; 
    } 
    return false; 
} 

Вы могли бы уйти с этим подходом с использованием PerSession instancing, где тот же экземпляр будет использоваться для обслуживания каждого клиента.

[ServiceContract(SessionMode = SessionMode.Required)] 
public interface IMyAPI 
{ 
... 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class MyAPI : IMyAPI 
{ 
... 
} 

Но, а не изобретать колесо, я бы смотреть на использование некоторых из built in WCF security.

+0

Сессия = true не возможно? – CallumVass

+0

@BiffBaffBoff извините, статья устарела. обновлено. –

+0

Я получаю следующую ошибку, когда я использую PerSession instancing: «Контракт требует сеанса, но привязка« BasicHttpBinding »не поддерживает его или не настроена должным образом для его поддержки.« – CallumVass

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