1

可能重复:
如何在 wcf 中添加自定义肥皂标题?

这是场景:

我有一个 WCF 服务,我们称之为“BusinessService”。

我还有一个 Web 应用程序,它有一个该服务的客户端来发送请求。

我希望能够记录谁正在向我的服务发送更新;因此,我的 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 并不容易,我可以在其中传递用户 ID),所以我的 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?

4

3 回答 3

0

您可以使用ServiceBehavior 特性的 InstanceContextMode 属性来为每个会话创建 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将在服务端按会话保留。

于 2012-09-10T21:50:54.937 回答
0

您还可以在消息 Header 中添加 userID。请参阅此链接。此方法在 WCF 之前的 Web 服务中使用。

于 2012-09-10T21:58:54.923 回答
0

我知道你会认为这是极端的但有优势

使用 UserName 进行身份验证并接受任何密码。并使用会话。这要求用户在执行任何操作之前传递一个用户 ID。他们不需要在每个方法调用中都发送用户 ID。

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

于 2012-09-10T22:02:46.803 回答