gpt4 book ai didi

httpwebrequest - 使用 ServiceStack.Client 超时

转载 作者:行者123 更新时间:2023-12-02 23:52:47 24 4
gpt4 key购买 nike

我已经通过 AJAX 调用使用服务堆栈一段时间了,没有出现任何问题,但最近创建了一个使用服务堆栈客户端(特别是 JsonServiceClient)的快速 winforms 应用程序。

但是 - 我遇到了一个问题,即我在前两次尝试中成功运行的调用中始终出现超时。看起来服务堆栈客户端正在保留某些资源,或者我以错误的方式使用客户端。它仅在针对远程服务运行时发生(每次都在本地计算机上运行)。这是我的代码和异常(exception)情况:

        var url = "http://www.TestServer.com/api";
var taskId = Guid.Parse("30fed418-214b-e411-80c1-22000a5b9fe5");
var email = "admin@example.com";

using (var client = new JsonServiceClient(url))
{
var result = client.Send(new Authenticate {UserName = "username", Password = "Password01", RememberMe = true});
client.Put(new AssignTask { AdminTaskId = taskId, Assignee = email });//Call #1 - works fine
client.Put(new AssignTask { AdminTaskId = taskId, Assignee = email });//Call #2 - works fine

try
{
client.Put(new AssignTask { AdminTaskId = taskId, Assignee = email });//Call #3 - works fine
}
catch (WebException ex)
{
//Times out every time
//at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
//at System.Net.HttpWebRequest.GetRequestStream()
//at ServiceStack.Net40PclExport.GetRequestStream(WebRequest webRequest)
//at ServiceStack.ServiceClientBase.<>c__DisplayClassa.<SendRequest>b__9(HttpWebRequest client)
//at ServiceStack.ServiceClientBase.PrepareWebRequest(String httpMethod, String requestUri, Object request, Action`1 sendRequestAction)
//at ServiceStack.ServiceClientBase.SendRequest(String httpMethod, String requestUri, Object request)
//at ServiceStack.ServiceClientBase.Send[TResponse](String httpMethod, String relativeOrAbsoluteUrl, Object request)
//at ServiceStack.ServiceClientBase.Put[TResponse](String relativeOrAbsoluteUrl, Object requestDto)
//at ServiceStack.ServiceClientBase.Put(Object requestDto)
//at SSClientIssue.Program.Main(String[] args) in c:\Users\David\Documents\Visual Studio 2013\Projects\SSClientIssue\SSClientIssue\Program.cs:line 27
throw;
}

}

超时后,我可以关闭并重新加载应用程序(服务器保持运行状态),然后再次获得相同的行为(两次成功的调用)。 IIS 日志显示第三次调用未到达服务器,因此看起来像是客户端问题。

我已经看了这个 8 个小时了,我觉得我的眼睛开始流血了......如果有人能帮忙,我会给你买瓶啤酒!

最佳答案

该问题是由于您的 ServiceClient未指定已知响应类型的请求。

响应类型可以使用 IReturn<T> 在请求 DTO 上标记标记(推荐):

public class GetAllAdminUsernamesRequest : IReturn<List<string>> { ... }

通过将其添加到请求 DTO 上,ServiceClient 能够自动推断并转换响应,例如:

List<string> response = client.Get(new GetCurrentAdminUserAdminTasks());

另外,在请求 DTO 上指定响应的另一种方法是在调用站点上指定它,例如:

List<string> response = client.Get<List<string>>(new GetCurrentAdminUserAdminTasks());

如果您不这样做,响应是未知的,因此 ServiceClient 将仅返回底层 HttpWebResponse这样您就可以自己检查响应。

HttpWebResponse tasks = client.Get(new GetCurrentAdminUserAdminTasks());

为了能够检查和读取HttpWebResponse ServiceClient 无法处理响应,因此由调用站点发出请求来正确处理它,即:

using (HttpWebResponse tasks = client.Get(new GetCurrentAdminUserAdminTasks())) {}
using (HttpWebResponse adminUsers = client.Get(new GetAllAdminUsernames())) {}

try
{
using (client.Put(new AssignTask { AdminTaskId = taskId, Assignee = user })) {}
using (client.Put(new AssignTask { AdminTaskId = taskId, Assignee = user })) {}
using (client.Put(new AssignTask { AdminTaskId = taskId, Assignee = user })) {}
using (client.Put(new AssignTask { AdminTaskId = taskId, Assignee = user })) {}
}
...

处理您的 WebResponses 响应将解决您的问题。

如果您不这样做,底层 WebRequest将限制打开的连接,并且在任何时间只允许有限数量的并发连接通过,可能作为防止 DDOS 攻击的安全措施。这就是保持底层连接打开的原因 WebRequest阻塞,等待它们被释放。

关于httpwebrequest - 使用 ServiceStack.Client 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26483395/

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