我有一个服务,我想使用我的客户的属性:
[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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我的客户端,我做:
Testing.MyAPIClient client = new Testing.MyAPIClient();
client.set_UserName("test");
client.set_Password("123");
Console.WriteLine(client.StockQuery("123456"));
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
问题是,当我调试UserName
并且Password
没有被设置时,它们都是空的
默认情况下,WCF将创建服务的新实例以服务每个调用(PerCall实例化),因此不会记住您的属性集.
您需要通过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;
}
Run Code Online (Sandbox Code Playgroud)
您可以使用PerSession实例化来避免这种方法,其中相同的实例将用于为每个客户端提供服务.
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMyAPI
{
...
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class MyAPI : IMyAPI
{
...
}
Run Code Online (Sandbox Code Playgroud)
但是,重新发明轮子,我会考虑使用一些内置的WCF安全性.
归档时间: |
|
查看次数: |
2717 次 |
最近记录: |