将userID发送到WCF服务而不作为方法参数发送

时间:2012-09-10 21:42:18

标签: c# .net wcf

  

可能重复:
  How to add custom soap headers in wcf?

以下是该方案:

我有一个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?

3 个答案:

答案 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。

http://msdn.microsoft.com/en-us/library/ff648840.aspx