gpt4 book ai didi

c# - 在 WCF 中使用属性

转载 作者:行者123 更新时间:2023-11-30 14:00:39 25 4
gpt4 key购买 nike

我有一个服务,我想使用来 self 的客户的属性:

[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();

问题是,当我调试时,UserNamePassword 没有被设置,它们都是空的

最佳答案

默认情况下,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

关于c# - 在 WCF 中使用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10229260/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com