2012-03-08 168 views
0

我有一个WCF服务这样的代码: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。

请帮助。提前致谢。

回答

1

您不应该重置SomeService.Password的值,因为它不是静态的。你有没有看到相反的东西?


由于您使用InstanceContextMode.Single(我原来忽略),你最好求助于我是嘲笑在你的网络结合单个人情况的行为。我能想到的唯一方法是促成这一点,就是拥有一个代理服务类,它与您的服务合同相匹配,并根据特定标准(可定义会话)将其调用委托给自定义实例。这样做会很麻烦,并且增加了不必要的抽象层次,但是(至少在我的脑海中)它应该可以工作

+0

感谢您的回答。这是因为我将它作为服务引用使用,并且服务的InstanceContextMode设置为Single,所以值不会改变。我希望该值不会更改每个服务实例。请帮忙。 – 2012-03-08 02:22:06

+1

更新了我的(现已删除的评论)详细信息的问题,希望它能帮助您。 – 2012-03-08 03:01:08