gpt4 book ai didi

c# - 服务堆栈性能

转载 作者:太空宇宙 更新时间:2023-11-03 22:44:02 25 4
gpt4 key购买 nike

首先让我说我喜欢 ServiceStack 作为客户端的设计。 (我从来没有将它用于服务器端)

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

这是我的单元测试。如果我单独运行它或使用一个副本运行它,它工作正常(150-1100 毫秒),但如果我制作 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。

最佳答案

您的请求 DTO 应该实现 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);
}

因为 ServiceStack 不知道您希望如何反序列化响应,所以它会返回打开的 HttpWebResponse这样您就可以自己检查响应(就像您在示例中所做的那样)。但这需要明确处理,因为 .NET 的 HttpWebRequest 只允许每个域打开几个并发请求,这将导致您的应用挂起/超时,因为它正在等待处理请求以保持在并发限制内。

首选的解决方案是始终使用 IReturn 注释您通过 ServiceStack 客户端发送的请求 DTO。或 IReturn<T>接口(interface)标记,如果它没有或者你想忽略 Response 工具 IReturnVoid否则执行IReturn<ResponseDtoType> :

class LoginRequest : IReturnVoid {}

它调用了 non-deprecated Post() method它处理 HttpWebResponse。

否则如果你想发送普通的 object DTO 在使用后需要处理 HttpWebResponse,例如:

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

隐式返回 HttpWebResponse 的 API已弃用以避免难以识别此类问题,我们建议使用上面的显式 API,它声明了 HttpWebResponse在调用站点返回类型,因此更容易识别它需要被处理。

另请注意 ServiceStack Service Clients对于调用 ServiceStack 服务,我们建议使用 HTTP Utils 调用其他服务相反。

关于c# - 服务堆栈性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50829050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com