3

クライアントのプロパティを使用したいサービスがあります。

[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いない場合、両方ともnullになることです。

4

1 に答える 1

8

デフォルトでは、WCFは各呼び出しにサービスを提供するサービスの新しいインスタンスを作成するため(PerCallインスタンス化)、プロパティセットは記憶されません。

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インスタンス化を使用すると、このアプローチを回避できる場合があります。この場合、同じインスタンスを使用して各クライアントにサービスを提供します。

[ServiceContract(SessionMode = SessionMode.Required)]
public interface IMyAPI
{
...
}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class MyAPI : IMyAPI
{
...
}

しかし、車輪の再発明ではなく、組み込みのWCFセキュリティの一部を使用することを検討します。

于 2012-04-19T13:40:47.613 に答える