以下是该方案:
我有一个WCF服务,我们称之为“BusinessService。”
我还有一个网络应用程序,该服务的客户端可以发送请求。
我希望能够记录谁向我的服务发送更新;因此,我的BusinessService有一个名为_userID的私有字符串成员以及一个设置此_userID的方法,这个类看起来像这样:
public class BusinessService : IBusinessService
{
private string _userID;
public void SetUserID(string userID)
{
_userID = userID;
}
public void UpdateCustomer(Customer customer)
{
// update customer here.
}
}
由于编写上述类的方式(因为我不能轻松地为WCF服务提供自定义custructor,我只能传递userID),那么我的Web应用程序就是这样编写的:
public class WebApp
{
private string _userID; // on page load this gets populated with user's id
// other methods and properties
public void btnUpdateCustomer_Click(object sender, EventArgs e)
{
Customer cust = new Customer();
// fill cust with all the data.
BusinessServiceClient svc = InstantiateWCFService();
svc.UpdateCustomer(cust);
svc.Close();
}
private BusinessServiceClient InstantiateWCFService()
{
BusinessServiceClient client = new BusinessServiceClient("EndPointName");
client.SetUserID(_userID);
return client;
}
}
查看存储的数据时,不会为用户ID保存任何内容。
是否有某种形式的设计模式或功能允许我记录谁正在进行一些更改,而我的服务不需要每次方法调用中的用户ID?
答案 0 :(得分:0)
您可以使用InstanceContextMode property of the ServiceBehavior attribute为每个会话创建WCF服务类。 (注意,这需要wsHttpBinding或其他会话感知绑定。)
[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class BusinessService : IBusinessService
然后,您需要做的就是更新客户端代码,以便每个会话使用一个代理类实例。一种简单的方法是将代理类存储在Session
对象中:
private BusinessServiceClient _client;
void Page_Init()
{
if (Session["client"] == null)
{
_client = InstantiateWCFService();
Session["client"] = _client;
}
else
{
_client = (BusinessServiceClient) Session["client"];
}
}
现在使用共享对象_client
而不是每次都实例化它。这样,会话和_uid
将在每个会话中保留在服务端。
答案 1 :(得分:0)
您还可以在邮件标题中添加userID。见link。此方法在WCF之前用于Web服务。
答案 2 :(得分:0)
我知道你会认为这是极端但有优势
使用UserName进行身份验证并接受任何密码。并使用会话。这要求用户在可以执行任何操作之前传递用户ID。并且他们不需要在每次方法调用时发送userID。