如何添加重试以调用 Web 服务?

2024-05-09

我有一个应用程序调用使用 wsHttpBinding 的 Web 服务。 我需要在连接超时等情况下对 Web 服务调用实现某种重试功能。执行此操作的最佳方法是什么?

我已经阅读过有关 WS-ReliableMessaging 的内容,但这不是 Web 服务的发布者必须在服务上实现的内容,而不是我必须在客户端执行的内容吗?


我假设您的调用是写入操作,因此您需要确保写入成功。

你是对的,WS-ReliableMessaging 标准确实需要在服务端实现。

您的主要问题是您可能会遇到不同类别的故障;可重试的故障和不可重试的故障,您的客户端必须知道哪一种是哪一种。

可重试的失败示例

  1. 由于网络可用性间歇性而失败
  2. 数据库死锁导致失败
  3. 服务超时(仅当服务操作幂等的 http://www.servicedesignpatterns.com/WebServiceInfrastructures/IdempotentRetry)

不可重试的失败示例

  1. 调用中数据错误的问题(没有必要重试,因为每次都会失败)
  2. 客户渠道问题
  3. 服务引入错误
  4. 服务超时(当服务操作非幂等时)

如果服务公开,那么确定调用失败的原因将会变得更加简单过错合约 http://msdn.microsoft.com/en-us/library/ms752208%28v=vs.110%29.aspx,如果失败,您将被迫捕获并询问服务上抛出的异常类型肥皂异常 http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapexception%28v=vs.110%29.aspx,并希望包含原始异常详细信息(默认情况下他们不是 http://msdn.microsoft.com/en-us/library/system.servicemodel.description.servicedebugbehavior.includeexceptiondetailinfaults%28v=vs.110%29.aspx)。其他类型的失败将向您提出各种WCF通道异常 http://blogs.msdn.com/b/pedram/archive/2008/01/25/wcf-error-handling-and-some-best-practices.aspx,如果未处理,所有这些都将中止客户端通道(包括任何会话)。

您关于超时的具体问题特别棘手 - 超时可能有多种原因,但基本上您不能假设您的呼叫失败 - 呼叫很可能已提交,但在发送响应之前客户端通道直接超时。在这种情况下,只有在可以的情况下重试才是安全的使用相同的数据多次调用服务,没有副作用.

如果服务操作无法按上述方式执行,最佳解决方案是对您刚刚尝试提交的数据执行查找。如果调用成功,数据应该在那里,否则您可以安全地重试。

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

如何添加重试以调用 Web 服务? 的相关文章

  • 在方法/数据成员中向 WCF 添加限制

    我是 WCF 新手 我尝试对数据成员添加限制 例如在这个方法中 DataMember public string StringValue get return stringValue set stringValue value 我想设置最大
  • PHP 可以解压缩使用 .NET GZipStream 类压缩的文件吗?

    我有一个 C 应用程序 它与基于 PHP 的 SOAP Web 服务进行通信以进行更新和许可 我现在正在开发一个反馈系统 供用户通过软件自动提交错误和跟踪日志 根据我之前发布的问题 我认为 Web 服务将是实现此目的的最佳方法 最有可能以最
  • 将固定文档/XPS 打印为 PDF,而不显示文件保存对话框

    我有一个FixedDocument我允许用户在 WPF GUI 中预览 然后打印到纸张上 而不显示任何 Windows 打印对话框 如下所示 private void Print PrintQueueCollection printQueu
  • WPF DataGrid 排序后滚动到顶部

    我有一个使用数据网格的 Net 4 0 WPF 应用程序 目前 按列排序后 网格的滚动位置保持在排序前的位置 对于此应用程序 我需要在任何排序后滚动到网格顶部 我尝试过像这样处理排序事件 Private Sub myDataGrid Sor
  • 无法从 Web 主机本身以外的任何地方连接到任何 Web 主机的 MySQL 数据库

    我有 2 个不同的虚拟主机 pagodabox 000webhost 都是免费的 并且我已经设置了localhost与MySQL 我已经在他们三个上安装了 wordpress 它们在自己的域中工作得很好 即 什么时候localhostwor
  • 如何在Entity Framework 5中正确触发集合的延迟加载?

    我在我的应用程序中使用 EF5 代码优先 我有一个包含一些延迟加载字段的表 public class TestEntity public int Id get set public virtual TestEntity2 SubEntity
  • GetEventLogs() 返回没有设置事件日志?

    采取以下 C 代码 EventLog eventLogs eventLogs EventLog GetEventLogs computername foreach EventLog evt in eventLogs statusMessag
  • 多线程 Web 应用程序

    我知道有很多情况都是在应用程序中使用多线程的好例子 但是什么时候最好在 net Web 应用程序中使用多线程 Web 应用程序几乎肯定已经由托管环境 IIS 等 实现多线程化 如果您的页面受 CPU 限制 并且想要使用多个核心 那么可以说多
  • SecurityAction.RequestMinimum 在 .Net 4.0 中已过时

    最近 我们的 Net 客户端库正在升级以针对 Net 4 0 进行编译 将目标框架更改为4 0后 应用程序出现一些编译错误 In AssemblyInfo cs assembly SecurityPermission SecurityAct
  • 如何从 html 页面 [javascript] 调用 Web 服务方法而不刷新页面

    我有一个webservice这将返回一个值 我的要求是 我需要调用它webservice从一个index html页面 该页面有一个 html 提交按钮 在该按钮上单击我正在呼叫JavaScript 从那里我想调用网络方法 我怎样才能做到这
  • 如何在嵌套列表视图中编辑数据

    我使用列表视图来显示项目列表 并使用嵌套列表视图来显示每个项目的功能列表 父列表视图和子列表视图都需要能够进行插入 编辑和删除操作 它适用于父列表视图 但是 当我尝试编辑子项目时 编辑按钮不会将其带入编辑模式 您能建议我代码中缺少什么吗
  • VB.net 应用程序保留以前的版本

    我有一个正在发布的 Visual Basic 项目 并且每次都会增加版本号 当我安装新版本时 它会打开 但一旦应用程序重新启动 它似乎就会恢复到以前的版本 我不知道为什么 尝试更新发布应用程序时所需的最低版本 转到应用程序属性 gt 发布
  • 如何禁用 WebBrowser 控件中的点击声音

    我使用 Javascript 单击网络浏览器控件中的链接 但我不想听到IE的 咔哒 声 有什么办法可以做到这一点吗 P S 我不想更改系统设置 我见过这个 如何仅在您的应用程序中禁用网络浏览器 点击声音 https stackoverflo
  • 如何使用 LibGit2Sharp 从 Git 获取更改?

    下面的代码将 Git url 克隆到测试目录 var url http abc 555 com team project 555 git var path E temp 555 var credential new Credentials
  • 装配和产品版本不匹配

    我正在尝试在 asp net 网站中使用 Ajax 控件工具包 我从之前的一个示例项目中复制了 dll 它有以下详细信息 Assembly Version 3 5 40412 0 File Version 3 5 40412 2 Inter
  • 在哪里使用 EF6 订阅 ObjectMaterialized?

    我正在尝试将我的上下文订阅到以下 OnjectMaterialized 事件this https stackoverflow com a 3756842 2835713 像这样 IObjectContextAdapter this Obje
  • 在 Visual Studio 2012 Express 上通过 Nuget 的 NUnit.Runners 不起作用

    我正在尝试使用 NuGet 管理器在 Visual Studio 2012 Express 中设置简单的 NUnit 项目 从 PROJECT gt Manage NuGet Packages 我安装了 NUnit 框架 并想要添加 NUn
  • 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

    显然 他们很 混乱 这是认真的原因吗 你还能想到其他的吗 你见过有多少开发人员并不真正理解 ref out 吗 我在真正需要的地方使用它们 但在其他地方则不然 它们通常仅在您想有效返回两个或多个值时才有用 在这种情况下它至少值得thinki
  • 从 SUDS 中的 SOAP 响应中提取 Cookie

    我必须使用具有多种服务的 API 所有这些都需要来自下面的身份验证的 JSESSION cookie 然而 当我调用下一个服务时 它不会保留 cookie 因此会拒绝它们 from suds client import Client url
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许

随机推荐