【问题标题】:should a web server throw an exception for an invalid request?Web 服务器应该为无效请求抛出异常吗?
【发布时间】:2014-09-05 03:40:34
【问题描述】:

我已经构建了一个基于给定 ID 检索文件的网络应用程序。如果服务器为无效 ID 抛出异常,这会停止服务器吗? (我已经在我的本地主机中尝试过,抛出异常后服务器似乎很好,但我仍然不确定,因为在我停止 Visual Studio 中的服务器后,浏览器甚至呈现页面。)

我这样做是因为我想有一种方法告诉客户端应用程序,如果可以检索文件,谁通过格式为主机名/get/id 的 http GET 访问我的 Web 应用程序。服务器返回一个 FilePathResult(在 C# 中)以获得一个有效的 ID。对于无效的ID,有没有比抛出异常更好的方法?

谢谢!

【问题讨论】:

  • 在检查客户端 ID 后让方法返回布尔值,然后重定向到解释结果的差异页面。
  • 当有人尝试通过输入文件 ID 下载文件时,我确实在网页上向用户显示了一个错误。但现在我正在处理另一个试图代表用户下载文件的程序(我为该程序提供了一个 url 模式)。抛出异常合适吗?

标签: c# .net exception webserver


【解决方案1】:

通常,您的代码引发的异常将导致 HTTP 500 响应。根据服务器配置,结果将是标准错误页面或带有异常详细信息的扩展错误报告 - 堆栈跟踪等。通常您不希望最终用户看到这些内容。

对于 MVC 应用程序,有两种基本方法可以处理此类代码中的报告失败。

首先,您可以使用适当的 HTTP 响应代码抛出 HttpResponseException:

if (!System.IO.File.Exists(filename))
    throw new HttpResponseException(HttpStatusCode.NotFound);

另一种选择是将控制器方法的返回类型更改为ActionResult,并在失败时返回不同类型的结果。例如,当您想要返回完整的重定向、错误视图等时,这很有用。

public ActionResult DownloadFile(string fname)
{
    string filepath = HostingEnvironment.MapPath("~/App_Data/" + fname);
    if (!System.IO.File.Exists(filepath))
        return new RedirectResult("~/Some/Error/Page");
    return new FilePathResult(filepath, "text/plain");
}

当然,这只是一个巨大的简化。基本上使用ActionResult 作为返回类型意味着您可以返回该类的任何派生类,包括您的FilePathResult、ViewResult(例如来自View 方法)或其他任何一种。

【讨论】:

  • 感谢您的解释!您认为在程序访问时抛出 HttpResponseException 并为人类进行重定向是一种好习惯吗?
  • 我个人不喜欢使用它,但 MVC 框架设置为接受这些异常作为有效输出。我猜这是一种风格选择。
【解决方案2】:

抛出异常不会停止网络服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 2012-03-06
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多