1

重複の可能性:
wcfにカスタムsoapヘッダーを追加するにはどうすればよいですか?

シナリオは次のとおりです。

「BusinessService」と呼ぶWCFサービスがあります。

このサービスのクライアントがリクエストを送信する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.
    }
}

上記のクラスの記述方法が原因で(userIDを渡すだけのWCFサービス用のカスタムcustructorを作成するのは簡単ではないため)、私の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には何も保存されていません。

サービスがすべてのメソッド呼び出しでuserIDを要求することなく、変更を加えているユーザーをログに記録できる何らかの形式のデザインパターンまたは機能はありますか?

4

3 に答える 3

0

これは極端だと思うかもしれませんが、利点もあります

UserName で認証し、任意のパスワードを受け入れます。そして、セッションを使用します。これにより、ユーザーは何かを行う前にユーザー ID を渡す必要があります。また、メソッド呼び出しごとにユーザー ID を送信する必要はありません。

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

于 2012-09-10T22:02:46.803 に答える
0

メッセージ ヘッダーに userID を追加することもできます。このリンクを参照してください。このメソッドは、WCF より前の Web サービスで使用されていました。

于 2012-09-10T21:58:54.923 に答える
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 に答える