相关疑难解决方法(0)

如何返回404状态,其中无效参数传递给我的ASP.NET MVC控制器?

404如果将无效参数传递给我的控制器,我想返回HTTP状态.例如,如果我有一个看起来像这样的控制器:

public ActionResult GetAccount(int id)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

然后我想返回404如果遇到这样的网址:

/GetAccount
/GetAccount/notanumber

即我想陷阱ArgumentException被抛出.

我知道我可以使用可以为空的类型:

public ActionResult GetAccount(int? id)
{
  if(id == null) throw new HttpException(404, "Not found");
}
Run Code Online (Sandbox Code Playgroud)

但那非常狡猾和重复.

我希望我可以在必要时将它添加到我的控制器:

[HandleError(View="Error404", ExceptionType = typeof(ArgumentException))]
public class AccountsController : Controller
{
  public ActionResult GetAccount(int id)
  {
    ...
  }
}
Run Code Online (Sandbox Code Playgroud)

但这似乎并不奏效.

我看到这篇文章这个答案几乎解决了我的问题:

在该答案中,创建了一个抽象的BaseController,您可以从中派生所有其他控制器:

public abstract class MyController : Controller
{
    #region Http404 handling

    protected override void HandleUnknownAction(string actionName)
    {
        // If controller …
Run Code Online (Sandbox Code Playgroud)

asp.net error-handling asp.net-mvc asp.net-mvc-routing asp.net-mvc-3

16
推荐指数
2
解决办法
3200
查看次数

ASP.NET MVC应用程序自定义错误页面未显示在共享主机环境中

我在我的共享主机上部署的ASP.NET MVC应用程序上遇到自定义错误问题.我创建了一个ErrorController并将以下代码添加到Global.asax以捕获未处理的异常,记录它们,然后将控制转移到ErrorController以显示自定义错误.此代码取自此处:

protected void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError();
    Response.Clear();

    HttpException httpEx = ex as HttpException;
    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Error");

    if (httpEx == null)
    {
        routeData.Values.Add("action", "Index");
    }
    else
    {
        switch (httpEx.GetHttpCode())
        {
            case 404:
                routeData.Values.Add("action", "HttpError404");
                break;
            case 500:
                routeData.Values.Add("action", "HttpError500");
                break;
            case 503:
                routeData.Values.Add("action", "HttpError503");
                break;
            default:
                routeData.Values.Add("action", "Index");
                break;
        }
    }

    ExceptionLogger.LogException(ex); // <- This is working. Errors get logged

    routeData.Values.Add("error", ex);
    Server.ClearError();
    IController controller = new ErrorController(); …
Run Code Online (Sandbox Code Playgroud)

error-handling asp.net-mvc shared-hosting global-asax

14
推荐指数
1
解决办法
7750
查看次数

asp.net mvc错误处理的最佳实践

我正在寻找一种标准方法来处理asp.net mvc 2.0或3.0中的错误

  • 404错误处理程序
  • Controller范围异常错误处理程序
  • 全局范围异常错误处理程序

error-handling asp.net-mvc

14
推荐指数
2
解决办法
2万
查看次数

忽略ASP.NET MVC4 CustomErrors DefaultRedirect

我有一个MVC 4应用程序,使用自定义HandleErrorAttribute来处理自定义异常.我想截取默认的404和其他非500错误页面,并用更有吸引力的东西替换它们.为此,我在Web.config中添加了以下内容:

<system.web>
    <customErrors mode="On" defaultRedirect="~/Error/Index" />
...
</ system.web>
Run Code Online (Sandbox Code Playgroud)

我有一个带有索引方法和相应视图的错误控制器,但我仍然得到默认的404错误页面.我也试过设置我defaultRedirect的静态html文件无济于事.我已经尝试添加特定于404内部的错误处理<customErrors>,我甚至尝试以编程方式修改路由,所有这些都没有结果.我错过了什么?为什么ASP忽略我的默认错误处理?

注意:我之前注意到我无法在本地测试我的CustomHandleErrorAttribute,即使是<customErrors mode="On".当我在我的服务器上从我的开发盒中点击它时它确实有效...不确定这是否相关. 这家伙有同样的问题.

asp.net-mvc asp.net-mvc-3 asp.net-mvc-4

13
推荐指数
2
解决办法
2万
查看次数

在使用IOCControllerFactory时,抛出类似StackOverflow的404,没有重定向

我在这里发现了另一个问题,它提供了我的问题的第一部分的解决方案,即如何在ASP.NET MVC中生成404页面而不重定向到另一个页面(因此最初请求的URL保留在地址栏中).

ASP.NET MVC - 如何抛出类似于StackOverflow上的404页面

protected void Application_Error(object sender, EventArgs e)
    {
        var exception = Server.GetLastError();

        Response.Clear();
        var httpException = exception as HttpException;
        var routeData = new RouteData();
        routeData.Values.Add("controller", "Error");

        if (httpException != null)
        {
            routeData.Values.Add("action", httpException.GetHttpCode() == 404 ? "NotFound" : "Unknown");

            // clear the error, otherwise, we will always get the default error page.
            Server.ClearError();

            // call the controller with the route
            IController errorController = new ErrorController();
            errorController.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));

        }
    }
Run Code Online (Sandbox Code Playgroud)

如果我不使用IOCControllerFactory,404方面的工作对我来说很好,但是一旦我使用工厂,不 …

error-handling asp.net-mvc ioc-container asp.net-mvc-3

12
推荐指数
1
解决办法
6011
查看次数

404的ASP.NET自定义错误页面为http状态返回302

在我的asp.net网站上,我在web.config文件中定义了以下自定义错误页面.

<customErrors mode="On" defaultRedirect="~/defaulterror.htm" >
<error statusCode="404" redirect="~/404.htm" />
Run Code Online (Sandbox Code Playgroud)

当找不到文件时它正确显示404.htm页面,但问题是当我做Fiddler跟踪它返回302作为HTTP状态代码.这是搜索引擎页面索引的一个大问题,因为这些破坏的链接仍然被索引最近因为这个在我的网站上.如何防止返回302作为文件未找到错误的HTTP状态代码,并返回404文件未找到错误.我正在使用asp.net 3.5.

.net asp.net

10
推荐指数
1
解决办法
2万
查看次数

如何使用库存标准ASP.NET MVC3网站获得自定义404和500错误页面?

我试图在一个库存样本ASP.NET MVC3网站上有2个自定义错误页面.

Darin Dimitrov在这里有一个很好的答案,但它并不适合我所有的测试条件.

然后广泛流行如何在ASP.NET MVC中正确处理404?发布..但这只是触及404错误.

有人可以解释一下

  • 路线
  • web.config 设置
  • 控制器/动作方法

要做这个非常简单的事情:(

接受这个答案的场景:

  • VS2010 - >文件 - >新建 - > ASP.NET MVC3项目/ Internet应用程序
  • (右键单击解决方案).. - >使用IIS Express
  • 错误页面不能是静态html页面.它们必须是一个我可以传递信息的页面,就像任何其他视图一样,等等(例如,a ErrorController)......

并为测试路线......

  • /Home/Index - >显示索引页面
  • /Home - >显示索引页面
  • / - >显示索引页面
  • /Home/About - >显示关于页面
  • /asdasd/asdsad/asdas/asddasd/adsad - > 404
  • /adsa/asda/asd/asd/asd/asd - > 404
  • /asdsadasda - > 404

然后将其添加到HomeController.cs班级..

public ActionResult ThrowException()
{
    throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)

现在 ..

  • /home/throwexception - > 500错误

干杯:)

顺便说一下,当使用股票标准new ASP.NET MVC3 …

.net c# error-handling asp.net-mvc

9
推荐指数
2
解决办法
9193
查看次数

ASP.NET MVC 404处理和IIS7 <httpErrors>

美好的一天!

我使用策略来处理404错误,如下所示:ASP.NET MVC 2和IIS 7.0的错误处理或者:如何在ASP.NET MVC中正确处理404?

简而言之:我在Global.asax没有添加任何路由规则的情况下处理404作为异常,如果异常是404我将使用错误消息呈现特殊控制器\动作.

在IIS6上,它适用于ASP.NET通配符映射.在集成模式的IIS7上,我需要添加以下内容Web.config(/error/HttpError404我在404页面的操作):

    <httpErrors>
        <remove statusCode="403" subStatusCode="-1" />
        <remove statusCode="404" subStatusCode="-1" />
        <error statusCode="404" prefixLanguageFilePath="" path="/error/HttpError404" responseMode="ExecuteURL" />
        <error statusCode="403" prefixLanguageFilePath="" path="/error/HttpError403" responseMode="ExecuteURL" />
    </httpErrors>
Run Code Online (Sandbox Code Playgroud)

为什么?路由在IIS集成模式和IIS6通配符映射上的工作方式不同?

提前致谢!

更新: 根据我的测试,似乎我的错误处理工作,我的404操作呈现,但似乎IIS看到404响应代码(我在404操作中以编程方式设置)并用默认错误替换我的页面.

当我设置时,<httpErrors>我有两个点击404页面:一个来自异常处理Global.asax,一个来自IIS.

这可能是原因吗?

asp.net-mvc iis-7 iis-6 asp.net-mvc-2

8
推荐指数
1
解决办法
7225
查看次数

为什么IIS Express使用<system.web>而不是<system.webServer>?

使用Cassini但切换到IIS Express.我最初的想法是,<system.web>除了以下内容之外我可以删除所有内容:

<authentication mode="Forms">
  <forms loginUrl="/" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

我以前customErrors的设置是这样的:

<customErrors mode="On" defaultRedirect="/ServerError">
  <error statusCode="404" redirect="/NotFound" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)

customErrors切换到IISExpress时删除了这个元素.现在404不再重定向到我漂亮的"NotFound"页面了.

用于我的网站的AppPool Clr4IntegratedAppPool让我知道它不使用Classic.

为什么IISExpress如此依赖于system.webIIS 7.5使用system.webServer

asp.net custom-errors iis-7.5 iis-express asp.net-mvc-3

8
推荐指数
1
解决办法
3650
查看次数

CustomErrors与HttpErrors - 一个重大的设计缺陷?

我们可能知道,例如customErrors和httpErrors有什么区别?,CustomErrors是一种在Web应用程序中定义错误页面的旧方法,但这种方法存在一些问题 - 例如,如果您关心正确的http响应代码,因为CustomErrors的方法是重定向到错误页面而不是替换当前响应,它通过http状态代码破坏了通信的大部分语义完整性.

自IIS 7.0以来,HttpErrors是一个更新的功能,它在服务器级而不是应用程序级运行,并且更适合以有效的方式处理错误响应,例如通过使用当前响应而不是重定向.

但是,如果在我看来,ASP.NET中这些工件的基础结构如今看起来给我们带来了一些问题.

一个简单的配置作为例子

<httpErrors existingResponse="Auto" errorMode="Custom">
    <remove statusCode="404"/>
    <error statusCode="404" path="/Error/E404" responseMode="ExecuteURL" />
</httpErrors>
Run Code Online (Sandbox Code Playgroud)

我们将errorMode设置为Custom,因为我们要测试错误处理本身,并将existingResponse设置为Auto,这将引入依赖于Response.TrySkipIisCustomErrors的分支:

  • 确实:现有的错误响应将通过此模块未经处理,考虑到它的语义含义,这是完全合理的.
  • 错误:如果HttpErrors模块具有匹配规则,则现有的错误响应将被替换为HttpErrors模块,这同样有意义.

理想情况下,这将允许我们自己处理一些错误,例如当../product/id中的产品不存在时,我们可以手动返回特定的404页面,其中包含有关缺失产品的信息,并且仍然让HttpErrors模块处理所有错误像..产品 /名称,但是只是../misspelledandunmatchableurl.

但是,据我所知,这是行不通的.原因在于内部方法System.Web.HttpResponse .ReportRuntimeError,它将在运行时错误(例如未找到控制器/操作)上调用,并且我们有一个如下所示的部分:

// always try to disable IIS custom errors when we send an error
if (_wr != null) {
    _wr.TrySkipIisCustomErrors = true;
}

if (!localExecute) {
code = HttpException.GetHttpCodeForException(e);

// …
Run Code Online (Sandbox Code Playgroud)

asp.net iis asp.net-mvc

8
推荐指数
1
解决办法
5145
查看次数