Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发送410 Gone标头,然后重定向_C#_Asp.net_Http Headers_Http Status Code 410 - Fatal编程技术网

C# 发送410 Gone标头,然后重定向

C# 发送410 Gone标头,然后重定向,c#,asp.net,http-headers,http-status-code-410,C#,Asp.net,Http Headers,Http Status Code 410,我有一个页面,检查用户是否登录或文件是否公开,然后通过Response.WriteFile将PDF推送到浏览器 除非Google为文件编制索引,然后我们删除该文件,否则效果很好。因此,我正在考虑在Response.Status中添加410,然后重定向到error.aspx页面 Firebug告诉我,当文件被删除时,它会在文档页面上获得一个“302已找到”状态代码。我在等410 重定向代码为: Response.Status = "410 Gone"; Response.AddHeader("Lo

我有一个页面,检查用户是否登录或文件是否公开,然后通过Response.WriteFile将PDF推送到浏览器

除非Google为文件编制索引,然后我们删除该文件,否则效果很好。因此,我正在考虑在Response.Status中添加410,然后重定向到error.aspx页面

Firebug告诉我,当文件被删除时,它会在文档页面上获得一个“302已找到”状态代码。我在等410

重定向代码为:

Response.Status = "410 Gone";
Response.AddHeader("Location", Request.Url.ToString());
Response.Redirect("error.aspx");

有人能告诉我我做错了什么吗?

这就是我如何做出永久性回应的方式。应该是类似的

    //in Global.asax.cs
    protected virtual void Application_BeginRequest (Object sender, EventArgs e)
    {
        if(Request.Url.Host=="www.earlz.biz.tm" || Request.Url.Host=="earlz.biz.tm" || Request.Url.Host=="www.lastyearswishes.com"){
            Response.Status = "301 Moved Permanently";
            Response.AddHeader("Location","http://lastyearswishes.com"+Request.Url.PathAndQuery);
            CompleteRequest(); //I believe this is the missing piece in your code.
        }

    }

重定向是通过发送一个状态来完成的,该状态指示资源在其他地方可用,例如301永久移动或302找到。不能在同一响应中发送两个状态代码。请求的资源不存在(因此您发送410),或者它确实存在于某个其他位置(因此您发送301或302或其他任何内容)


不过,我认为您不应该重定向到错误页面,因为错误消息不是应该有自己URL的单独资源。如果客户机请求一个文件,而该文件已消失,则发送410 gone状态,并将错误消息作为响应正文-这样,错误消息将从不存在的文件本身的URL返回。搜索引擎将看到状态代码并了解文件已丢失,浏览器将向用户显示响应正文,以便用户可以读取错误消息。

如果查看规范,它会声明“没有已知的转发地址”,因此重定向似乎无效。如果希望人类用户看到某些内容,您可以在响应中返回与
error.aspx
相同的主体

请求的资源在服务器上不再可用,并且 转发地址是已知的。这种情况预计会发生 被认为是永久的。具有链接编辑功能的客户端应该 在用户批准后删除对请求URI的引用。如果 服务器不知道或没有工具来确定 该情况是永久性的,状态代码404(未找到)应为 用它来代替。除非另有说明,否则此响应是可缓存的

410响应主要是为了协助web应用程序的任务 通过通知收件人资源已被删除来进行维护 故意不可用,并且服务器所有者希望 无法删除指向该资源的远程链接。这样的事件对我们来说很常见 有限的时间、促销服务和资源属于 不再在服务器站点上工作的个人。事实并非如此 必须将所有永久不可用的资源标记为“消失”或 将标记保留任意长度的时间,这由 服务器所有者的自由裁量权


我一直在解决类似的问题。如果带有资源的页面从web上删除,我想告诉GoogleBot410离开了,从缓存中删除,但我想为访问者提供一个类似的替代页面

我是这样解决的:

public ActionResult RealEstate(int id, string title)
{
...prepare the model
if (realEstateModel.Result.OfferState == OfferState.Deleted)
{
    var alternativeSearchResult = PrepareAlternative(realEstateModel);
    return Gone410(alternativeSearchResult, context);                                        
}
else
   return View(realEstateModel);

}
@model Bla.ModelGone410

@{
    Layout = null;

    Html.RenderAction("Index", "Search",
        new
        {
            type = Model.type,
            Category = Model.Category,
            city_id = Model.city_id,
            ...
        });
}
Gone410.cshtml看起来像这样:

public ActionResult RealEstate(int id, string title)
{
...prepare the model
if (realEstateModel.Result.OfferState == OfferState.Deleted)
{
    var alternativeSearchResult = PrepareAlternative(realEstateModel);
    return Gone410(alternativeSearchResult, context);                                        
}
else
   return View(realEstateModel);

}
@model Bla.ModelGone410

@{
    Layout = null;

    Html.RenderAction("Index", "Search",
        new
        {
            type = Model.type,
            Category = Model.Category,
            city_id = Model.city_id,
            ...
        });
}
和RealEstate.cshtml:

@model Bla.realEstateModel

@{
    Layout = null;
}

This is realestate view...

这将向google bot提供410响应,并在不重定向的情况下为用户搜索备选方案。

您也可以使用这种方式,首先更改您的愿望状态

Response.Status = "410 Gone";
Response.AddHeader("Location", Request.Url.ToString());
ScriptManager.RegisterStartupScript(this, this.GetType(), "redirectScript", "window.location.href=error.aspx", true);`

因此,您可以获得所需的页面和状态。

CompleteRequest()不是有效的方法:)感谢您的输入:)@jet它是
HttpApplication.CompleteRequest
。它结束HTTP请求。我不知道你也在尝试重定向,这是错误的。你选择的答案是正确的