【问题标题】:Is there any way to make a web request in C# that does not throw an exception on 4xx and 5xx status codes?有什么方法可以在 C# 中发出不会在 4xx 和 5xx 状态码上引发异常的 Web 请求?
【发布时间】:2011-07-06 08:50:04
【问题描述】:

我使用 CouchDB 作为 C# Web 服务的数据源。

由于是 RESTful,当要求提供不存在的文档时,CouchDB 会传回状态码 404。标准的 .NET Web 请求希望在此引发异常,但(至少对我而言)通过异常传达数据源已返回“无结果”是非常可怕的;这是一种我真的不想在我的代码中飘荡的臭味......

我可以使用 WebRequest 的替代品来处理我认为合适的状态代码吗?

编辑: 只是为了澄清一下,由于我到目前为止的回复:我不想隐藏 WebRequest 引发的异常。我正在寻找一种标准 WebRequest 的替代方案,它不会基于状态代码引发异常,因为 .NET 对什么构成错误的解释似乎不符合 REST 原则。

EDIT #2 我真的需要一种兼容 3.5 的方式来执行此操作;很抱歉一开始没有具体说明。

【问题讨论】:

  • 为什么不将 httpWebrequest 包装在自己的代理中,以便您在一个地方处理异常,然后您的其余代码可以处理状态?
  • 在 DAL 层中捕获异常,使其对应用程序的其余部分隐藏?
  • 我根本不希望异常在我的代码中传达有关完全有效响应的信息,如果可能的话,隐藏异常并不能解决这个问题。
  • @jdoig 确实如此,您在包装器中捕获异常,并返回您可以使用的东西。

标签: c# rest couchdb http-status-code-404


【解决方案1】:

HttpClient 库在请求后不会抛出异常。有关用法示例,请参阅this

【讨论】:

  • 我刚刚尝试过这个(如上面的链接所述): var client = new HttpClient(); var response = client.Get("myCouchDBSever/user/someUserID");它确实会在收到 404 响应时抛出:(
  • @jdoig 奇怪,它不适合我。
  • @jdoig 我也刚刚检查了wcf.codeplex.com 上的最新版本的 HttpClient,它也没有对我抛出异常。
  • +1,不知道发生了什么。但我只是希望这个答案可以打败我自己的答案,因为我在哲学上反对使用 CouchDB 客户端库(至少对于文档操作等简单的事情)。
  • 啊,我使用的是 Rest Starter Kit 中的 HttpClient ...最新版本是它的替代品,并且仅是 .NET 4.0 :(
【解决方案2】:

我没有使用它们,但有几个专用的 C# CouchDB 客户端库。

CouchOne's list of CouchDB drivers

还有CouchDB wiki list of C# clients

我个人的偏好是尽可能地紧贴 HTTP 层。 HTTP 非常简单,CouchDB API 非常简单。不需要中间件来访问它。 (不幸的是,您的 WebRequest 课程显然有这个错误。)

【讨论】:

  • 谢谢,但这就是我正在做的。我用于访问沙发的代码很少(比其他可用的 .NET 沙发库少很多代码)。问题在于 .NET 发出 Http Web 请求的标准方式;这会在 4xx 和 5xx 状态码上引发错误。这不是我的代码或 .NET 库中的“错误”,只是一个令人沮丧的不灵活的实现。
【解决方案3】:

我不确定你的问题是什么。如果您不想在询问不存在文档时得到 404,我认为您只需要在 IIS 设置中添加通配符应用程序映射并取消选中“验证该文件存在”框即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多