最佳实践 - 从 Web 服务抛出异常

2024-02-01

我们有一个 ASMX Web 服务,我们使用 ajax (jQuery) 从 ASP.NET 应用程序调用它。

我们的网络方法的典型示例如下:

[WebMethod]
public void DoSomething(BusinessObject myParameter)
{

    try
    {
       BL.DoSomethingWithParam(myParameter);
    }
    catch(Exception ex)
    { 
        //logic to log the actual exception goes here
        //and then we throw a more user-friendly error as so:
        throw new Exception("Unable to perform action such an such");
    }
}

在客户端我们会有这样的东西:

$.ajax({
   type: "POST",
   url: "WebService.asmx/DoSomething",
   data: "{}",
   contentType: "application/json; charset=utf-8",
   dataType: "json",
   success: function(result) {
      //do something with result.d
    },
   error: function(xhr, ajaxOptions, thrownError){ 
      alert($.parseJSON(xhr.Response.Text).Message);
   }
});

上述方法有几个问题,我想解决:

  1. 当我们在本地机器上测试应用程序时,Internet Explorer 会显示我们在 Web 方法的 throw new Exception 行上抛出的实际错误消息(在提供的示例代码的情况下:“无法执行此类操作”)BUT当我们部署到舞台环境并远程测试时;它不再显示我们抛出的错误,而是显示:"There has been an error processing your request."
  2. 在 Firefox 上(我们没有测试更多浏览器),它根本不显示任何内容,但 Firebug 显示抛出了 HTTP 500 错误。

总之,我们没有适当地处理这个问题,所以我的问题是:

  1. 在本地和远程测试时,将这些错误传达给客户端并在所有浏览器之间保持一致的行为的最佳方法是什么?
  2. 为什么 IE 不像 Firefox 那样崩溃?当然,远程测试 IE 也会出现一些问题,即不显示真正的错误消息并将其替换为通用错误消息There has been an error processing your request但为什么 Firefox 不这样做呢?
  3. 考虑到该 Web 服务也将被公司内的其他 Java Web 应用程序使用,那么维持与这些应用程序的互操作性的最佳方法是什么?我们怎样才能在 Web 方法上抛出这些异常,并让 Java 应用程序能够捕获它们并进行适当的处​​理?

我们实现的一种替代方案(目前仍处于开发阶段)是在发生错误时从 Web 方法返回一个字符串,但这确实是一种丑陋的黑客/不优雅的方法。

Note:不要问我“处理您的请求时出错”消息来自哪里。我一点儿想法也没有。我们的代码中没有任何内容可以返回该消息。


我不知道是否已经出现了“正确”的方式,因为 Web 服务的使用方式变化如此之快,最终,任何构建来使用该服务的客户端都能够处理您选择的任何方法。我毫不怀疑最终会设计出一种方案,但现在取决于你。

话虽如此,请尽量避免我过去见过的一些更常见的陷阱。

  1. 缺乏一致性:如果您的 Web 服务有多个方法,请设计一种方法,使它们都可以以相同的方式传达错误,以使您的方法更易于使用。就我个人而言,我更喜欢跟随协议栈的脚步并使用某种一致的标头。使用公共标头构建生成的消息,以便可以在整个客户端代码中使用相同的逻辑来确定方法调用是否成功。
  2. 不支持多个错误消息:有时会发生多个故障。让客户端看不到次要错误可能会很麻烦,并且会减慢调试尝试的速度。
  3. 错误消息缺乏识别:如果错误是由于特定字段无效而导致的,则允许客户端根据您提供的信息以编程方式识别哪个字段是罪魁祸首。

这些天我通常开始使用的方法看起来像这样:

{
    Success: bool,
    Errors[]: {
        Id: string,
        Source: string,
        Message: string
    },
    Message: { *Method specific structure* }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最佳实践 - 从 Web 服务抛出异常 的相关文章

  • 用于生成多色文本的 jQuery 插件,该文本可在悬停时改变颜色

    我想为各种链接生成多色文本 并从预先指定的颜色数组中为各个字母随机分配颜色 当将鼠标悬停在带有文本的 div 上时 颜色会发生变化 我正在考虑一个 jQuery 插件 脚本将是可行的方法 我想知道是否存在这样的插件或近似插件 Thanks
  • 命名空间“Microsoft”中不存在类型或命名空间名称“AspNet”错误?

    I ve downloaded a website and in VS express open it through file gt open website When I press F5 to debug I get build er
  • 如何重定向到 $.AJAX 上的视图完整 - asp.net mvc 3

    好的 我想在验证检查后使用 AJAX 将用户重定向到周围视图 我该怎么做 请帮忙 这是我的 AJAX 代码 EX 我希望用户重定向到 Home Movies 控制器操作 如果未登录 则停留在同一页面
  • 将 GUID 转换为整数并返回

    所以我有一个必须与之交互的第三方应用程序 该应用程序需要我的用户表中的用户ID 问题是我将我的 userID 存储为 GUID 而第 3 方应用程序仅接受整数 所以我想 如果有一种方法可以将 GUID 转换为整数 然后能够将其转换回来 当我
  • 在 Magento 中使用缩略图切换基本图像

    在定制的产品视图页面上 我正在处理基本图像 大图像 和缩略图列表 这些缩略图是与媒体库中的产品相关的其他图像 它们只是普通图像 而不是定义的图像 缩略图 我的任务是获取它 以便当您单击缩略图时它会更改上面的基本图像 我已经可以工作了 但是我
  • 关于线程池最大线程数的说明

    我读了here http blogs msdn com b tmarq archive 2010 04 14 performing asynchronous work or tasks in asp net applications asp
  • 与现有表单完美集成的多文件上传器

    我知道这个问题可能太笼统了 但在花了一整天的时间思考这个问题之后 我对这个问题感到非常困惑 任何人都知道上传插件 那会与现有形式轻松集成 我尝试过的所有上传器插件 jQuery 文件上传 Plupload Uploadify Dropzon
  • 判断jQuery是否没有找到任何元素

    我正在使用 jQuery 的选择器 尤其是 id 选择器 elementId 我该如何判断 jQuery 是否找到了该元素 即使具有指定 id 的元素不存在 下一条语句也会给出 object Object alert idThatDoesn
  • jqGrid cellattr 标题忽略空格后的文本

    我在 jqgrid 中有 colmodel 它有 名称 和 描述 列 我需要将鼠标悬停在 名称 列上时将描述显示为工具提示 假设我有这个模型 例如 colModel name name cellattr function rowId val
  • 如何识别当前打开的每个单独的浏览器窗口?

    如何使用 javascript 唯一地识别当前为所有主要浏览器打开的每个单独的浏览器窗口 让我解释一下我需要了解的内容 并考虑以下场景 我有 3 个当前打开的浏览器窗口 任何现代浏览器 即 Chrome Firefox 等 每个窗口都包含多
  • 无限水平滚动 Div

    我需要一个 div 当您将鼠标进一步向右或向左移动时 它会水平滚动 我发现 Smooth Div Scroll 插件 http www smoothdivscroll com 非常接近我的需要 然而 这存在一些问题 我需要能够使滚动元素从设
  • 在 .NET C# 项目中使用 PHP

    有谁知道是否可以 以及是否有任何复杂性 在 NET C 项目中使用 PHP 语言 我知道 VB 和 C 现在可以混合在解决方案中 所以我想知道 由于 IIS 现在能够运行 PHP 您是否可以将它们组合成一个单一的运行时 显然 提出这个问题的
  • HTML 解析 - 从 div 内的表格获取数据?

    我对 HTML 解析 抓取的整个想法还比较陌生 我希望我能来这里获得我需要的帮助 基本上我想要做的 我认为 是指定我希望从中获取数据的页面的 url 在这种情况下 http www epgpweb com guild us Caelestr
  • jQuery:在 jQuery 对象中存储附加/额外的数据/信息?

    在 jQuery 对象中存储额外的数据是否可能且明智 现在我有包含一些数据的对象 但这些对象也有该数据的视觉表示 这可行 但我有很多代码来保持它们同步 例如 如果您从 dom 中删除一个对象 我还必须从对象数组中删除相关对象 删除相当简单
  • javaScript从单个值数组返回一个新的成对值数组[重复]

    这个问题在这里已经有答案了 可能的重复 将数组分割成块 https stackoverflow com questions 8495687 split array into chunks 我正在尝试将值数组转换为新的配对值数组 例如我需要转
  • WCF 自定义序列化器

    我正在 WCF 中创建一个返回 JSON 的 Web 服务 但 DataContractJsonSerializer 对某些循环引用犹豫不决 在这种特殊情况下我无法删除这些引用 相反 我想使用 Newtonsoft json 库 在 WCF
  • 在机器密钥更改期间维护 ASP.Net 成员密码

    是否有实用程序或代码示例可以使用旧密钥解密 然后使用新密钥为 ASP Net 会员用户加密密码 提到的解决方法都不适合我 我的解决方案如下 它首先以明文形式存储密码 然后使用新的 MachineKey 再次对其进行重新加密 机器钥匙更换 h
  • 以编程方式在网格视图列上显示数据

    我有一个产品数量列表和一个网格视图 网格视图已经绑定到一些数据 但我想在网格视图的第三列显示产品数量列表 以下是如何将数据绑定到网格视图的代码 gvProduct DataSource distSPUItem gvProduct DataB
  • 引导多重选择(刷新)无法正常工作

    我正在使用引导多选列表框 当用户在多选上选择选项时 它会正确显示 但有一个选项可以重置以前选择的选项 当用户点击重置按钮时 自动style display none添加到下拉按钮 下拉列表变得不可见 这是我的代码 button click
  • 带分页的过滤表

    我想要一个带有分页的表格 同时在表格标题中带有搜索框 所以使用这段代码jsfiddle分页 http jsfiddle net Xugej 1445 I want output like this 这是我的过滤代码 function sea

随机推荐

  • 删除字符串中除字母以外的所有字符

    如果我有一个字符串 ja v a 如何删除所有非字母字符以输出 java 我努力了str str replaceAll W 但无济于事 你能试试这个吗 System out println ja v a replaceAll a zA Z
  • Android 上的点对点音频通话:语音中断和延迟(接收数据包延迟)增加

    我正在尝试在 Android 上建立点对点音频通话 我使用 Android 手机和平板电脑进行通信 但在收到大约 40 个数据包后 手机几乎停止接收数据包 然后突然收到一些数据包并播放它们 依此类推 但等待时间增加 同样 平板电脑最初接收数
  • Robot Framework调用的测试如何将信息返回到控制台

    我有一个调用 python 方法的机器人框架测试套件 我希望 python 方法能够将消息返回到控制台而不会导致测试失败 具体来说 我正在尝试计算一个过程的时间 我可以使用 raise 将消息返回到控制台 但同时测试失败 def doSom
  • Spring-mvc控制器和异常处理

    想问您一个有关 spring mvc 控制器的最佳实践问题 请查看下面的代码 Autowired SomeService service RequestMapping public ResponseBody Response createS
  • 将文本添加到 android 可绘制 xml

    我正在尝试使用 android 可绘制 xml
  • 访问网络应用程序中文件的内容而不上传

    据我所知 如果不先上传到服务器 然后重新下载给用户 就不可能在网络应用程序中访问用户计算机上的文件内容 除非使用某种插件 Flash等 理想情况下 用户将文件直接上传到本地存储 然后脚本将有机会处理 显示 验证 过滤 而无需用户等待上传 即
  • Spring:如何在Web应用程序和独立程序中获取应用程序上下文

    我是 Spring 框架的新手 我们想在Web应用程序中引入它 3 1 目前在Web层使用struts 在业务层使用服务外观和业务对象 在持久层使用自编写的JDBC DAO 所有这些都是紧密耦合的 我创建了几个 xml 配置 其中一个用于
  • Python pandas 从一列字符串的数据选择中过滤掉 nan

    不使用groupby我如何过滤掉数据而不NaN 假设我有一个客户将填写的矩阵 N A n a 或其任何变体和其他变体将其留空 import pandas as pd import numpy as np df pd DataFrame mo
  • 将大文件读入 R

    我是 R 的新手 但我知道它会因 大 文件而窒息 我正在尝试读取 200MB 的数据文件 我已经尝试过 csv 格式 并将其转换为制表符分隔的 txt 但在这两种情况下 我在文件加载之前就用完了 4GB RAM R 使用 4GB 或内存来加
  • VirtualBox 上的 Android x86:Android 已连接但不在线

    我正在尝试使用 Oracle VirtualBox 配置 Android x86 运行机器 以便它可以与 Eclipse 一起使用 我在使我的虚拟机 在线 时遇到一些麻烦 我通过在 Android 终端模拟器中键入以下内容将手机连接到 ad
  • 检查元组中的元组中是否存在元素

    我有一个元组列表 如下所示 CODES apple reddelicious caramel sweetsticky banana yellowfruit 检查该元组中是否存在值的最佳方法是什么 例如我希望能够说 apple in CODE
  • 清理 PHP 中的文件路径

    我希望确保我的小程序的安全 以便潜在的恶意用户无法查看服务器上的敏感文件 path home gsmcms public html central app webroot GET file if file exists path echo
  • Azure DevOps 管道中存在不明确的参数“HEAD^”

    我在网上看到很多示例如何在 CI 中的 Azure DevOps 管道期间获取更改文件 只需使用简单的代码 changedFiles git diff name status HEAD HEAD 但是当我尝试在 yaml 管道中使用它时出现
  • 蚂蚁的战斗策略

    这个问题是指谷歌赞助的人工智能挑战 http aichallenge org 每隔几个月举行一次的竞赛 参赛者需要提交一个能够自主与其他机器人玩家玩游戏的机器人 刚刚结束的比赛名为 蚂蚁 您可以阅读其所有规范here http aichal
  • 使用 LINQ 进行现有查询

    我想使用 LINQ 获取员工列表 这些员工必须在TypeOfWorks列出typeofWork通过 Id 在论证中 public class Employee public virtual IList
  • Codeigniter - 使用 set_value() 填充表单进行编辑(不涉及 POST)

    我有一个包含表单的视图 带有输入字段和单选按钮 该表单需要填充数据库中的数据 以便将其用作数据编辑表单 我已使用 set value 函数进行表单验证 其中在发布后从同一控制器调用视图 但是如何在没有 POST 的情况下使用 set val
  • 加速 Numpy 数组/OpenCV cv2 图像的迭代

    我有 3 个形状 gt 500 500 的 numpy 数组 我正在尝试同时迭代它们 我尝试了两种不同的方法 但都很慢 Here Ix Ix blur Ix Iy blur and Iy Iy blur大小相同 我正在尝试寻找特征并将其绘制
  • 将 JSON jQuery Ajax 发送到 PHP 并返回

    我在通过 Ajax 将 JSON jQuery 数组发送到 PHP 脚本时遇到问题 这里有什么问题 var tee voting image img attr id var vote 1 var thing tee tee vote vot
  • 为kendo数据源提供一个角度范围变量

    我目前正在尝试用远程数据填充剑道网格 Kendo 有它自己的函数来获取数据 但我想使用我创建的角度工厂 所以我有一个工厂 它有一个函数 getSkills 该函数从我的api获取所有技能对象 angular module MyApp fac
  • 最佳实践 - 从 Web 服务抛出异常

    我们有一个 ASMX Web 服务 我们使用 ajax jQuery 从 ASP NET 应用程序调用它 我们的网络方法的典型示例如下 WebMethod public void DoSomething BusinessObject myP