Web服务器是否应该为无效请求抛出异常?

时间:2014-09-05 03:40:34

标签: c# .net exception webserver

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

通常,代码抛出的异常将导致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作为返回类型意味着您可以返回该类的任何衍生物,包括FilePathResultViewResult(例如来自View方法)或任何其他人。