代码之家  ›  专栏  ›  技术社区  ›  LorneCash

服务堆栈性能

  •  1
  • LorneCash  · 技术社区  · 7 年前

    首先,我要说我喜欢将ServiceStack设计为客户机。(我从未在服务器端使用过)

    我正在为API调用编写一个C包装器,我不断地得到超时和身份验证错误。我已经联系了另一端的开发人员,他们向我保证在他们的一端没有问题,我一定是做错了什么。通常我不会相信他们,我会构建一个示例项目来演示这个问题,但在这种情况下,他们会将我指向一个网页,该网页将测试我在C中运行的相同API,并且他们可以尽快地重新进行身份验证,单击提交按钮。我忘记了他们用来测试的确切地点,但我的故事已经够多了…我肯定我做错了什么,我就是不知道。

    这是我的单元测试。如果我单独运行它或使用一个副本,它可以正常工作(150-1100ms),但是如果我复制3个或更多副本,我只会得到2-3个副本,其余的将超时。

    [TestMethod]
    [Timeout(5000)]
    public void Login_Success1()
    {
        var client = new JsonServiceClient("apiurl");
        var response = client.Login("XXXAccessKeyXXX", "XXXSecretKeyXXX");
    
        //Assertions
    }
    

    这是我的扩展方法:

    public static class Extensions
    {
        public static (bool Success, string Message, string Token) Login(this JsonServiceClient client, string accessKey, string secretKey)
        {
            try
            {
                var response = client.Post(new LoginRequest(accessKey, secretKey));
                var authorization = response.Headers.GetValues("Authorization")[0];
                return (true, string.Empty, authorization);
            }
            catch (Exception ex)
            {
                return (false, $"Authentication failed: {ex.Message}", string.Empty);
            }
        }
    }
    

    下面是登录请求:

    [Route("/sessions")]
    [DataContract]
    internal class LoginRequest
    {
        internal LoginRequest(string accessKey, string secretKey)
        {
            AccessKey = accessKey ?? throw new ArgumentNullException(nameof(accessKey));
            SecretKey = secretKey ?? throw new ArgumentNullException(nameof(secretKey));
        }
    
        [DataMember(Name = "accessKey")]
        internal string AccessKey { get; set; }
    
        [DataMember(Name = "secretKey")]
        internal string SecretKey { get; set; }
    }
    

    我认为这是所有相关的代码,但如果你觉得我错过了什么,请lmk。

    1 回复  |  直到 7 年前
        1
  •  3
  •   mythz    7 年前

    IReturn<T> IReturnVoid object call the deprecated Post() method 以下内容:

    /// <summary>
    /// APIs returning HttpWebResponse must be explicitly Disposed, e.g using (var res = client.Post(url)) { ... }
    /// </summary>
    [Obsolete("Use: using (client.Post<HttpWebResponse>(requestDto) { }")]
    public virtual HttpWebResponse Post(object requestDto)
    {
        return Send<HttpWebResponse>(HttpMethods.Post, ResolveTypedUrl(HttpMethods.Post, requestDto), requestDto);
    }
    

    HttpWebResponse

    IReturn ireturn<t> 接口标记,如果它没有或您想忽略响应实现 IReturn<ResponseDtoType> 以下内容:

    class LoginRequest : IReturnVoid {}
    

    non-deprecated Post() method

    否则,如果您想发送纯文本 DTO需要在使用后处理httpWebResponse,例如:

    using (var response = client.Post<HttpWebResponse>(new LoginRequest(accessKey, secretKey)))
    {
        var authorization = response.Headers.GetValues("Authorization")[0];
    }
    

    HTTP Web响应 HTTP Web响应

    ServiceStack Service Clients 支持调用ServiceStack服务,支持调用我们建议使用的其他服务 HTTP Utils