使用 ServiceStack.Client 超时

2023-12-04

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

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

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

        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未指定已知响应类型的请求。

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

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());

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

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阻塞,等待它们被释放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ServiceStack.Client 超时 的相关文章

随机推荐

  • 更改日期格式

    我有一个 DateTime 变量 例如时间戳 它以通常的格式保存日期 如下所示 11 1 2011 该变量用于构建 SQL 命令 Oracle数据库只接受以下格式的日期 YYYY MM DD 如何操作我的变量以这种格式存储日期 根本不要格式
  • 底部导航视图中所选选项卡的颜色

    我正在添加一个BottomNavigationView到一个项目 我想为选定的选项卡使用不同的文本 和图标色调 颜色 以实现灰显未选定的选项卡效果 使用不同的颜色android state selected true 在颜色选择器资源文件中
  • data.table中按组填充缺失值

    如果想要根据一组内的前 后非 NA 观察来填充变量的缺失值 则 data table 命令是 setkey DT id date DT value filled in DT is na value list id date value DT
  • 使用 C# 解析复杂的 XML

    我正在尝试使用 C 解析复杂的 XML 我正在使用 Linq 来完成它 基本上 我正在向服务器发出请求并获取 XML 这是代码 XElement xdoc XElement Parse e Result this newsList Item
  • 为什么要在 CSS 文件路径中添加版本号?

    我注意到有些网站将版本号 尤其是 放在 CSS 文件路径中 例如 放置版本号的主要目的是什么 如果目的是记住 CSS 文件上次更新的时间 那么版本号不应该作为注释添加到 CSS 文件中吗 From HTML5 样板文档 什么是 v 1 v
  • 可滑动的侧面菜单不起作用

    我为响应式页面 针对移动页面 编写了一个自定义可滑动侧菜单 这是代码 jQuery code window load function data toggle click function var toggle el this data t
  • 理解链表实现的问题

    更新 非常感谢所有回复的人 这让我觉得在学习 Java 的过程中我并不孤单 请原谅 但我想我没有足够澄清我对链表和练习应用程序的不了解 首先 类定义如何包含其自身的对象 好吧 我知道这是递归 但对我来说仍然是一个非常奇怪和陌生的概念 第二
  • Safari 11 上的视频自动播放

    您好 我注意到视频不再在 Safari 11 上自动播放 下面是我的代码 它可以在 Chrome 上运行 因为它必须被静音 它仅显示海报图像 任何帮助
  • 使用 Java 中的 Selenium Webdriver 以不同用户身份运行 IE

    有谁知道如何使用 JAVA 使用 以不同用户身份运行 功能让 selenium 运行 IE 会话 我不知道我该如何设置这个 谷歌没有提出任何东西 所以也许我在某个地方寻找错误的东西 为了详细说明为什么我需要这样做 我正在测试的网站是一个内部
  • 在 MAMP 上安装 Phing 和 PHPUnit

    我在 OS X 10 6 上的 MAMP 下运行 phpunit 时遇到问题 我已经通过 PEAR 安装了 phpunit 它存在于 MAMP 目录中 但是当我在终端中运行 phpunit 时没有任何反应 我猜这是一个路径问题 但作为一个
  • PHPword在模板中插入表格

    PHPWord new PHPWord section PHPWord gt createSection table section gt addTable i 1 document PHPWord gt loadTemplate var
  • gcm推送通知:先成功,然后未在IOS中注册

    在 IOS 中使用谷歌云消息接收通知的所有段落之后 但我遇到了这个问题 我在 php 中发送带有服务器密钥和设备令牌的通知的帖子 第一次响应为 成功 但在设备上没有收到任何内容 第二次以及随后的时间 响应为 未注册 我重复所有段落 在钥匙串
  • constexpr 对于重载有用吗

    C 中有没有一种方法可以根据输入的运行时 编译时常量调用不同的重载 我的 MSVC 版本 12 无法使用 constexpr 执行此操作 阅读 C 文档 我不确定这是否是 constexpr 的工作方式 inline int Flip4 c
  • 从 Unity 中的另一个脚本访问对象的位置

    我正在制作一个同时包含球和玩家的游戏 到目前为止 我为球制作了一个球体 为玩家制作了一个正方形 模型将在稍后制作 我为玩家附加了一个移动脚本 以便它可以向各个方向移动 但我希望他能够在碰到球时捡起球 为此 我假设在球脚本中的碰撞函数中 我必
  • 如何使用 Sevenzipsharp 提取文件

    我将使用 Sevenzipsharp 将 ISO 文件中的文件提取到 USB 为此 我从 vs nuget 包管理器下载了 Sevenzipsharp 并编写了 实际上我不能 这段代码 我没有接受任何错误 但它不起作用 我哪里会犯错误 请写
  • 使用 javascript 搜索“\”

    我编写了以下代码来仅获取不带扩展名和路径的文件名 我正在浏览器中运行它
  • React-Router 在新选项卡中打开链接

    有没有办法得到反应路由器在新选项卡中打开链接 我尝试了这个 但没有成功 Test 可以通过添加类似的东西来弄乱它onClick foo 像我上面那样链接到链接 但会出现控制台错误 Thanks 从 React Router 版本 5 0 1
  • 用于检查号码以“078”开头且仅包含 10 位数字的正则表达式

    我需要验证 Asp Net 应用程序中的文本框 用户可以在其中输入手机号码 并且该号码应以 078 开头 并应包含 10 位数字 Sample 0781234567 这是我的代码 public static bool CheckPhoneN
  • 在 jQuery 移动应用程序中将参数从一个页面传递到另一个页面

    我正在使用 PhoneGap 构建 jQuery 移动应用程序 我必须使用 jQuery mobile 传递前一个页面的一些参数来打开一个新页面 为此 我尝试使用本地存储 如下所示 li click function console log
  • 使用 ServiceStack.Client 超时

    我已经通过 AJAX 调用使用服务堆栈一段时间了 没有出现任何问题 但最近创建了一个快速 winforms 应用程序 它利用服务堆栈客户端 特别是 JsonServiceClient 然而 我遇到了一个问题 即我一直在呼叫超时 但在前两次尝