Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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# 重定向到MVC 5中动态添加的URL_C#_Asp.net Mvc_Asp.net Mvc 5_Mvcroutehandler - Fatal编程技术网

C# 重定向到MVC 5中动态添加的URL

C# 重定向到MVC 5中动态添加的URL,c#,asp.net-mvc,asp.net-mvc-5,mvcroutehandler,C#,Asp.net Mvc,Asp.net Mvc 5,Mvcroutehandler,我的要求是将用户从旧url重定向到新url。我的实体如下: public class HttpRedirect { [Key] public int Id { get; set; } [Required(ErrorMessage = "Old url is required.")] [MaxLength(1000)] //[Url] [Display(Name = "Old Url")] public string OldUrl { ge

我的要求是将用户从旧url重定向到新url。我的实体如下:

public class HttpRedirect
{
    [Key]
    public int Id { get; set; }

    [Required(ErrorMessage = "Old url is required.")]
    [MaxLength(1000)]
    //[Url]
    [Display(Name = "Old Url")]
    public string OldUrl { get; set; }


    [Required(ErrorMessage = "New url is required.")]
    [MaxLength(1000)]
    //[Url]
    [Display (Name = "New Url")]
    public string NewUrl { get; set; }

}
Url已注释,以便我可以在localhost中工作

所以当请求旧的url时,我希望请求被转移到新的url 为了在应用程序_BeginRequest事件中的global.asax文件中实现这一点,我有以下代码

protected void Application_BeginRequest(object sender, EventArgs e)
{
  //You don't want to redirect on posts, or images/css/js
  bool isGet = HttpContext.Current.Request.RequestType.ToLowerInvariant().Contains("get");
  if (isGet && HttpContext.Current.Request.Url.AbsolutePath.Contains(".") == false)
  {
    string lowercaseURL = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
    string newUrl = new HttpRedirectRepository().RedirectUrl(lowercaseURL);
    if(newUrl != null)
       {
         lowercaseURL = newUrl;
       }
     lowercaseURL = lowercaseURL.ToLower().Trim() + HttpContext.Current.Request.Url.Query;
     Response.Clear();
     Response.Status = "301 Moved Permanently";
     Response.AddHeader("Location", lowercaseURL);
     Response.End();
   }
}
我已经实现了上面的代码来完成2个任务。 1.将url更改为小写 2.如果新url可用于请求的url,请重定向到该url

在我上面的实现中,我强烈地感觉到它正在工作,但通过重定向到小写字母会导致无限循环

那么,如何防止多重重定向呢。例如。 我请求并且我已经将它的新url设置为,当请求mypage时,它应该重定向到小写的自制url,并且重定向应该只发生一次

注意

  • 我只需要在我自己的域内重定向
  • 用户将输入旧url和新url的完整url地址
  • 更新

    根据@RobertHarvey的一些提示,我修改了我的代码,如下所示,这对我来说是有效的

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
      //You don't want to redirect on posts, or images/css/js
      bool isGet = HttpContext.Current.Request.RequestType.ToLowerInvariant().Contains("get");
      if (isGet && HttpContext.Current.Request.Url.AbsolutePath.Contains(".") == false)
      {
        bool redirect = false;
        string requestUrl = (Request.Url.Scheme + "://" + HttpContext.Current.Request.Url.Authority + HttpContext.Current.Request.Url.AbsolutePath);
        //You don't want to change casing on query strings
        string newUrl = new HttpRedirectRepository().RedirectUrl(requestUrl);
        if (newUrl != null)
        {
          requestUrl = newUrl;
          redirect = true;
         }
         if (Regex.IsMatch(requestUrl, @"[A-Z]"))
         {
           requestUrl = requestUrl.ToLower().Trim() + HttpContext.Current.Request.Url.Query;
           redirect = true;
          }
          if (redirect)
          {
            Response.Clear();
            Response.Status = "301 Moved Permanently";
            Response.AddHeader("Location", requestUrl);
            Response.End();
           }
        }
    } 
    
    尽管如此,我仍然相信更新的实现有一些局限性。我将感谢任何进一步的代码增强和案例覆盖

    你的两个“注释”相互矛盾。如果您只想在域内允许重定向,那么记录完整的URL(包括域)是完全不必要的,而且只会使事情变得复杂。将旧/新URL设置为绝对路径。这也解决了您在开发和生产环境中工作的问题,因为您不需要担心数据在正确的环境中具有正确的域


    注意:无限重定向是代码中的一个bug。您应该重定向到
    newUrl
    ,而不是
    lowercaseUrl
    。如果
    newUrl
    为空,则不存在重定向,因此在这种情况下,您完全不应该重定向。

    无限循环意味着,您的主控制器多次被调用?@SivaGopal yes,因为对重定向的url也会执行beginrequest,该url也会通过添加响应头位置来响应,这会导致另一个重定向,并且此过程一直在进行。我遇到类似的情况,比如写Response.Redirect(“~/Home.aspx”)在Home.aspx页面加载事件中。您是否可以简单地添加一个阻止第二次重定向的
    if
    条件?您是否可以显示一些您在Home.aspx中正在执行的操作的示例代码?@RobertHarvey我试图通过在会话中写入url来执行此操作,但在处理begin请求时会话对象不可用。所以我想我需要在begin请求中引入一些变量。这如何解决他的无限重定向问题?@Chris Pratt用户添加完整url比添加协议和域名以外的内容更容易。虽然我们可以从完整的ur获取绝对url。使用绝对url时,事情将如何进行?重定向不需要完整的url。只需重定向到路径,就会假定当前域和协议。