相关疑难解决方法(0)

如何从ASP.NET MVC 3控制器返回200 HTTP状态代码

我正在编写一个接受来自第三方服务的POST数据的应用程序.

当此数据被POST时,我必须返回200 HTTP状态代码.

我怎么能从我的控制器那里做到这一点?

asp.net-mvc

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

ASP.NET自定义404返回200 OK而不是404 Not Found

在尝试为Google网站站长工具设置我的网站后,我发现我的自定义ASP.NET 404页面未返回404状态代码.它显示了正确的自定义页面并告诉浏览器一切正常.这被认为是软404或假404.谷歌不喜欢这个.所以我发现了很多关于这个问题的文章,但我想要的解决方案似乎没有用.

我想要解决的解决方案是将以下两行添加到自定义404页面的Page_Load方法后面的代码中.

Response.Status = "404 Not Found";
Response.StatusCode = 404;
Run Code Online (Sandbox Code Playgroud)

这不起作用.页面仍然返回200 OK.然而,我发现如果我将以下代码硬编码到设计代码中,它将正常工作.

<asp:Content ID="ContentMain" ContentPlaceHolderID="ContentPlaceHolderMaster" runat="server">

<%
    Response.Status = "404 Not Found";
    Response.StatusCode = 404;
%>

 ... Much more code ...

</asp:content>
Run Code Online (Sandbox Code Playgroud)

该页面正在使用母版页.我正在我的web.config中配置自定义错误页面.我真的宁愿使用后面的代码选项但我似乎无法在设计/布局中放入黑客内联代码使其工作.

c# asp.net master-pages custom-errors http-status-code-404

79
推荐指数
5
解决办法
8万
查看次数

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
查看次数

IIS7和HTTP状态代码处理

我试图在IIS7(集成模式)中对错误的渲染进行完全的程序控制,因此我有一个硬核头痛.我想要做的是给出错误(找不到页面,内部服务器错误,未经过身份验证等),使用正确的HTTP状态代码将整个请求传输到自定义ASPX或HTML(我更喜欢后者).

我想要的是IIS7没有给出我设置HTTP状态代码的废话.我不想要它的错误处理.当我设置时Response.StatusCode = (int)HttpStatusCode.NotFound,我想要的不是IIS来呈现自己的错误页面,而是可能将请求转移到另一个文件.

我已经让这个静态配置工作了:

<configuration>
  <system.webServer>
    <httpErrors>
      <clear />
      <error statusCode="404" path="/errors/404.html" responseMode="ExecuteURL" />
    </httpErrors>
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

虽然这很有效,但鉴于错误情况,它并没有让我以编程方式控制如何处理响应.配置是一个很好的后备,但我真的希望能够在某些情况下设置Response.StatusCode和呈现与配置完全不同的东西404.html(如果我们收到JSON响应Accept: application/json),但IIS7不会让我.不是机会.

那我该怎么办?我试图设置HttpResponse.TrySkipIisCustomErrors Property,但这看起来像一个巨大的黑客,似乎并不一致.将此属性设置为true确实是建议的最佳做法,以获得我想要的行为?

目前,我留下的感觉只不过是对IIS7的强烈仇恨.任何人都可以通过证明我只是愚蠢并且我确实可以完全控制HTTP堆栈来帮助我解决这个问题吗?

iis-7 http http-status-codes

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

customErrors与自定义模块

我目前有httpErrors设置处理500's: -

<httpErrors errorMode="Custom" existingResponse="Replace">
        ......
        <remove statusCode="500"/>
        <error statusCode="500" path="/server-error" responseMode="ExecuteURL"/>
</httpErrors>
Run Code Online (Sandbox Code Playgroud)

这工作正常,但在iis收到错误的情况下,我仍然得到死亡的黄色屏幕.一个例子是当实体框架无法连接到数据库并且我收到: -

无法打开登录请求的数据库"Test-DB".
登录失败.
用户'sa'登录失败.

我已经设置customErrors好处理这个: -

<customErrors mode="On" defaultRedirect="error.html" redirectMode="ResponseRedirect">
        <error statusCode="500" redirect="error.html" />
</customErrors>
Run Code Online (Sandbox Code Playgroud)

只要没有没有,它modules就能按预期工作preCondition="managedHandler".

我有几个模块处理图像和CSS文件,并在同一个项目中.

<modules runAllManagedModulesForAllRequests="false">
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
        <add name="ImageHandler" type="foo.bar.ProductImageHandlerHttpModule" />
        <add name="CustomCssHandler" type="foo.bar.CustomCssHttpModule" />
        <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" preCondition="integratedMode" />
</modules>
Run Code Online (Sandbox Code Playgroud)

评论这些,我得到了error.html,保持他们,我得到

运行时错误
说明:处理请求时发生异常.此外,执行第一个异常的自定义错误页面时发生另一个异常.请求已终止.

显示项目中的模块在尝试显示时也出错error.html.

有谁知道修复/解决方法?

c# asp.net iis asp.net-mvc httpmodule

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

您如何使用自定义错误并保留响应代码?

在我的web.config打击你可以看到redirectMode ="ResponseRewrite".我读到这是保存状态代码所需要的.不幸的是,只要我有它,我得到:

"处理您的请求时发生异常.此外,在执行第一个异常的自定义错误页面时发生了另一个异常.请求已终止."

省略此变量成功将我重定向到〜/ Error/Index.cshtml但响应为200. doh.任何方向都将非常感谢,谢谢.

<system.web>
    <compilation debug="true" targetFramework="4.5" />
    <customErrors mode="On" redirectMode="ResponseRewrite" defaultRedirect="~/Error/Index">
      <error statusCode="404" redirect="~/Error/Index"/>
      <error statusCode="500" redirect="~/Error/Index"/>
    </customErrors>
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.webServer>
    <httpErrors errorMode="Custom" existingResponse="Auto" defaultResponseMode="ExecuteURL">
      <remove statusCode="403"/>
      <remove statusCode="404"/>
      <remove statusCode="500"/>
      <error statusCode="403" path="~/Error/Index" responseMode="File"/>
      <error statusCode="404" path="~/Error/Index" responseMode="File"/>
      <error statusCode="500" path="~/Error/Index" responseMode="File"/>
    </httpErrors>
  </system.webServer>
Run Code Online (Sandbox Code Playgroud)

在我的filterconfig.cs中:

public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            // does this conflict?
            filters.Add(new HandleErrorAttribute());
        }
    }
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc-5

6
推荐指数
1
解决办法
1571
查看次数

设置响应状态代码会在自定义错误页面顶部导致不需要的错误文本

更新:

为确保将正确的状态代码返回给浏览器,error.aspx具有以下行:

<% Response.StatusCode = 500; %>
Run Code Online (Sandbox Code Playgroud)

删除它会删除不需要的文本,但我想要正确的状态代码,所以我想这是一个新问题......如何!?

设置响应状态代码具有相同的结果:

HttpContext.Current.Response.StatusCode = 500;
Run Code Online (Sandbox Code Playgroud)

将更新问题标题.

PRE-UPDATE:

由于一些遗留代码/配置,我们有一个稍微不寻常的自定义错误页面设置,它处理异常,global.asax并用于Server.Transfer()显示相应的.aspx错误页面,如下所示:

public void Application_Error(object sender, EventArgs e)
{
    // abbreviated to clear out logging and some other logic that determines which error page to show

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Server.ClearError();

    var context = HttpContext.Current;
    if (context != null)
    {
        var errorPage = "~/ErrorPages/error.aspx";
        context.Server.Transfer(errorPage);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是,当向远程用户显示error.aspx时,页面会附加一条错误消息(以及一个新的开放正文标记...),因此该页面的第一行是无样式的文本说:

The page cannot be displayed because an internal server error has occurred.
Run Code Online (Sandbox Code Playgroud)

虽然也许我正在使用Google搜索错误的内容,但它似乎并不是一个记录良好或经常讨论的问题.

欢迎任何想法.error.aspx代码非常通用,但我很乐意发布它是否有帮助 - 请注释.

.net asp.net-mvc global-asax

6
推荐指数
1
解决办法
992
查看次数

如果未找到动态内容,则正确地将用户发送到404(ASP.NET MVC)

我已经为ASP.NET MVC 3中的一般情况实现了404处理,因为没有找到控制器/视图.但是,如果用户试图访问无法找到的内容,应如何在控制器内部进行处理?例如www.foo.bar/Games/Details/randomjunk将在里面调用GamesController:

public ActionResult Details(string id) // id is 'randomjunk'
{
  if(DoesGameExist(id) == false)
    // Now what?
Run Code Online (Sandbox Code Playgroud)

我可以做一个,return Redirect('/Errors/Http404');但这似乎不是正确的方法.你应该抛出异常还是别的什么?

在这种情况下我们可以有一个特殊的观点,但首先我们需要一个很好的方法来应用于几个案例.

编辑:我想展示我已经拥有的友好404页面的一般情况.

c# asp.net-mvc http-status-code-404 asp.net-mvc-3

3
推荐指数
2
解决办法
6504
查看次数

ASP.NET MVC 5 ajax 错误 statusText 总是“错误”

我在向 ajax 调用发送错误的自定义消息时遇到问题。我的控制器返回如下内容:

return new HttpStatusCodeResult(400, "My error!");
Run Code Online (Sandbox Code Playgroud)

我的 ajax 代码如下所示:

error: function (xhr, httpStatusMessage) {
              console.log(xhr.statusText);
              console.log(httpStatusMessage);
}
Run Code Online (Sandbox Code Playgroud)

问题是 xhr.statusCode 和 httpStatusMessage 总是“错误”。我现在做错了什么?我期待有“我的错误!” 在 xhr.statusText 中。

我正在使用ASP.NET MVC 5jquery-1.10.2

我的 xhr 输出是:

abort:ƒ ( statusText )
always:ƒ ()
complete:ƒ ()
done:ƒ ()
error:ƒ ()
fail:ƒ ()
getAllResponseHeaders:ƒ ()
getResponseHeader:ƒ ( key )
overrideMimeType:ƒ ( type )
pipe:ƒ ( /* fnDone, fnFail, fnProgress */ )
progress:ƒ ()
promise:ƒ ( obj )
readyState:4
responseText:"Bad Request"
setRequestHeader:ƒ ( name, …
Run Code Online (Sandbox Code Playgroud)

javascript asp.net ajax asp.net-mvc jquery

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