我有一个 WCF服务代码,如下所示:
[ServiceContract]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,
ConcurrencyMode = ConcurrencyMode.Multiple)]
public class SomeService
{
public string Password { [OperationContract] get; [OperationContract] set; }
public void CheckPassword()
{
if (Password == null || Password != "password")
throw new FaultException("Invalid Password");
}
[OperationContract]
public string SomeMethod()
{
this.CheckPassword();
return "Some Data";
}
}
客户端Windows应用程序就像这样使用它:
public class ClientClass
{
public ClientClass()
{
STASomeService.Value.SomeMethod();
}
}
public class ClientClass
{
public ClientClass()
{
STASomeService.Value.set_Password("password");
}
}
每当SomeService.Password
类被实例化时,如何重置SomeService
的值?我不希望攻击者访问我的服务方法,但是当实际的客户端设置密码,密码保留在每个服务调用的SomeService.Password
属性中。但我想保留每个实例的Password
值,因为客户端需要它。
我的代码在C#,框架4中,在VS2010 Pro中构建。
请帮忙。提前谢谢。
答案 0 :(得分:1)
您不必重置SomeService.Password
的值,因为它不是静态的。你有没有看到相反的事情?
由于你正在使用InstanceContextMode.Single
(我最初忽略了),你最好的办法是嘲笑在你的网络绑定单例中拥有单个实例的行为。我能想到的唯一方法就是拥有一个匹配服务合同的代理服务类,并根据特定条件(定义会话)将其调用委托给自定义实例。维护这种方式会很麻烦并且增加了不必要的抽象级别,但(至少在我的脑子里)它应该可以工作