WCF中的特殊角色



我正在使用sha-1来加密密码,然后将其发送到服务。

正在加密以下密码。

客户端

httpgetCommand.cs

public class HttpGetCommand<TResult> : AbstractHttpCommand<TResult>
    where TResult : class
{
    private readonly Dictionary<string, object> _parameters = new Dictionary<string, object>();
    protected override string TypeRequest { get { return "GET"; } }
    public HttpGetCommand(string url)
        : base(url)
    { }
    public HttpGetCommand(string url, Action<TResult> successAction, Action<Exception> errorAction)
        : base(url, successAction, errorAction)
    {
    }
    public HttpGetCommand<TResult> AddParameter(object urlParameter)
    {
        AddUrlParameter(urlParameter);
        return this;
    }
    public HttpGetCommand<TResult> AddParameter(string name, object value)
    {
        _parameters.Add(name, value);
        return this;
    }
    public T AddParameter<T>(string name, object value)
        where T : HttpGetCommand<TResult>
    {
        _parameters.Add(name, value);
        return (T)this;
    }
    public override TResult Execute()
    {
        return _httpService.Get<TResult>(Url, _parameters);
    }
    public async override Task ExecuteAsync()
    {
        await _httpService.GetAsync(Url, _parameters, SuccessAction, ErrorAction);
    }
    public override string ToString()
    {
        return base.ToString() + GetParams();
    }
    private string GetParams()
    {
        if (!_parameters.Any())
        {
            return string.Empty;
        }
        var sb = new StringBuilder();
        sb.Append("?");
        foreach (var parameter in _parameters)
        {
            sb.AppendFormat("{0}&{1}", parameter.Key, parameter.Value.ToString().Replace(' ', '+'));
        }
        return sb.ToString();
    }
}

logincommand.cs

public class LoginCommand : HttpGetCommand<LoginResult>
{
    public LoginCommand()
        : base("Login")
    {
    }
    public LoginCommand(Action<LoginResult> successAction, Action<Exception> errorAction)
        : base("Login", successAction, errorAction)
    {
    }
    public LoginCommand SetUsername(string username)
    {
        return AddParameter<LoginCommand>("username", username);
    }
    public LoginCommand SetPassword(string password)
    {
        return AddParameter<LoginCommand>("userpassword", password);
    }
}

在代码中,我按以下方式打电话

 return new LoginCommand()
            .SetUsername(username)
            .SetPassword(password)
            .Execute();

服务方面

[OperationContract]
[WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
Stream Login(string username, string userpassword);

但是,如果Encyrtion具有特殊的特征,例如" ",则无法与服务联系。

例如,如果来自客户端的加密密码,例如

d908980/fhjdfgf89sdsd+sdsd

然后,它可以到达服务方面如下

d908980/fhjdfgf89sdsd sdsd

您的GetParams实现是有缺陷的。您需要确保查询字符串正确编码,并以查询字符串的正确格式编码。

sb.AppendFormat("{0}={1}&", 
    Uri.EscapeDataString(parameter.Key), 
    Uri.EscapeDataString(parameter.Value.ToString())
);

最新更新