2014-09-05 146 views
0

我已经构建了一个基于给定ID检索文件的Web应用程序。如果服务器为无效ID引发异常,这是否会停止服务器? (我已经在我的本地主机上试过了,服务器在抛出exceptoin后似乎没有问题,但我仍然不确定,因为浏览器甚至在我停止在Visual Studio中的服务器之后呈现页面。)Web服务器应该为无效请求抛出异常吗?

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

谢谢!

+0

有一个方法检查客户端ID后返回一个布尔值,然后重定向到一个解释结果的差异页面。 – OneFineDay 2014-09-05 03:53:04

+0

当用户尝试通过输入fileID下载文件时,我确实在网页上向用户显示错误。但现在我正在处理另一个试图代表用户下载文件的程序(我为该程序提供了一个url模式)。正在抛出一个适当的异常? – totoro 2014-09-05 04:15:14

回答

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方法)或其他任何衍生产品。

+0

感谢您的解释!你认为在程序访问时抛出HttpResponseException是一个很好的做法,同时为人类重定向? – totoro 2014-09-05 05:50:19

+0

我个人不喜欢使用它,但是MVC框架被设置为接受这些异常作为有效输出。我猜想这是一种风格选择。 – Corey 2014-09-06 09:21:40

0

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

相关问题