【问题标题】:Redirect URI cannot contain newline characters.(Query String)重定向 URI 不能包含换行符。(查询字符串)
【发布时间】:2013-08-22 12:21:14
【问题描述】:

我收到此错误重定向 URI 不能包含换行符。运行以下代码时。我正在工作MVC 4。她的是我的工作代码。

 protected void Application_Error(Object sender, System.EventArgs e)
            {
                System.Web.HttpContext context = HttpContext.Current;
                System.Exception exception = Context.Server.GetLastError();
                var stackTraceExcep = new StackTrace(exception, true); // create the stack trace
                var stackTrace = stackTraceExcep.GetFrames()         // get the frames
                              .Select(frame => new
                              {                   // get the info
                                  FileName = frame.GetFileName(),
                                  LineNumber = frame.GetFileLineNumber(),
                                  ColumnNumber = frame.GetFileColumnNumber(),
                                  Method = frame.GetMethod(),
                                  Class = frame.GetMethod().DeclaringType,
                              }).FirstOrDefault();


                string FileName = stackTrace.FileName;
                string LineNumber = stackTrace.LineNumber;
                string ColumnNumber = stackTrace.ColumnNumber;
                string MethodName = stackTrace.Method.Name;
                string ClassName = stackTrace.Class.Name;
                if (!string.IsNullOrEmpty(exception.Message))
                {
                    Response.Redirect(String.Format("~/Error/{0}/?errorMessage={1},FileName={2},LineNumber={3},ColumnNumber={4},MethodName={5},ClassName={6}", "App_Error", exception.Message, FileName, LineNumber, ColumnNumber, MethodName, ClassName));//I got this error in this line 
                }
                context.Server.ClearError();
            }

什么问题?我们如何解决这个问题?我已经搜索并尝试了谷歌并得到了一些堆栈溢出的答案。但任何事情都对我没有帮助。

现在我该怎么办?

我的控制器操作方法

[HttpGet]
        public ActionResult App_Error(string errorMessage, string fileName, string lineNumber, string columnNumber, string methodName, string className)
        {
            string errorNumber = Convert.ToString(errorRepository.AddError(errorMessage, fileName, Convert.ToInt32(lineNumber), Convert.ToInt32(columnNumber), methodName, className));
            ViewData["message"] = "An error has occurred in the application . The error number is : " + errorNumber;
            return View();
        }

【问题讨论】:

    标签: c# asp.net-mvc query-string global-asax


    【解决方案1】:

    您需要使用 HttpUtility 或 UrlHelper 对异常消息进行 URLEncode

    HttpUtility.UrlEncode(exception.Message)
    

    如下更改您的重定向行

    Response.Redirect(String.Format("~/Error/{0}/?errorMessage={1},FileName={2},LineNumber={3},ColumnNumber={4},MethodName={5},ClassName={6}", "App_Error", HttpUtility.UrlEncode(exception.Message), FileName, LineNumber, ColumnNumber, MethodName, ClassName));
    

    【讨论】:

      【解决方案2】:

      试试这个代码

      我认为。您的文件名是 null 或 Url 字段。所以它很困惑并显示错误。现在我刚刚更改了您的代码,请参见粗线。

      编辑

      而且你的查询字符串格式是错误的。 Please Change ,( comma) to & (and)

       protected void Application_Error(Object sender, System.EventArgs e)
              {
                  System.Web.HttpContext context = HttpContext.Current;
                  System.Exception exception = Context.Server.GetLastError();
                  var stackTraceExcep = new StackTrace(exception, true); 
                  var stackTrace = stackTraceExcep.GetFrames()         
                                .Select(frame => new
                                {                   // get the info
                                    FileName = frame.GetFileName(),
                                    LineNumber = frame.GetFileLineNumber(),
                                    ColumnNumber = frame.GetFileColumnNumber(),
                                    Method = frame.GetMethod(),
                                    Class = frame.GetMethod().DeclaringType,
                                }).FirstOrDefault();
      
      
                  **string FileName = !string.IsNullOrEmpty(stackTrace.FileName) ? Server.UrlEncode(stackTrace.FileName) : "";**
                  string LineNumber = stackTrace.LineNumber.ToString();
                  string ColumnNumber = stackTrace.ColumnNumber.ToString();
                  string MethodName = stackTrace.Method.Name;
                  string ClassName = stackTrace.Class.Name;
                  if (!string.IsNullOrEmpty(exception.Message))
                  {
                      Response.Redirect(String.Format("~/Error/{0}/?errorMessage={1}&fileName={2}&lineNumber={3}&columnNumber={4}&methodName={5}&className={6}", "App_Error", exception.Message, FileName, LineNumber, ColumnNumber, MethodName, ClassName));
      
                  }
                  context.Server.ClearError();
              }
      

      【讨论】:

      • 现在错误消失了。但是我在错误消息参数中获得了所有详细信息。其他参数是 return null 。为什么?
      • 您的查询字符串格式错误。将 ,(逗号)更改为 &(和)
      【解决方案3】:

      错误消息可能不仅包含换行符,还可能包含其他格式。 您需要在作为查询字符串参数发送之前对其进行编码:

      UrlHelper.Encode(exception.Message)
      

      【讨论】:

      • 您是否尝试过您发送的每个可以是字符串的参数?
      • 是的。请再看一遍我的问题
      • 现在。那个错误就解决了。但是所有值都是由 errorMessage 参数发送的,另一个参数是 null 。为什么
      【解决方案4】:

      您也可以使用 (asp.net) 中的 Session 或 MVC 中的 tempdata 来做同样的事情

      【讨论】:

      • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
      【解决方案5】:

      消息很清楚:您的查询字符串中有一个新行。放置一个断点并快速查看违规行以查找新行的位置并修复它。

      否则这段代码可能会解决问题:

      String.Format("~/Error/{0}/?errorMessage={1},FileName={2},LineNumber={3},ColumnNumber={4},MethodName={5},ClassName={6}", "App_Error", exception.Message, FileName, LineNumber, ColumnNumber, MethodName, ClassName).Replace(@"\r\n", string.Empty);
      

      【讨论】:

      • 现在。那个错误就解决了。但是所有值都是由 errorMessage 参数发送的,另一个参数是 null 。为什么
      • 您应该为此打开一个新问题。但是,我完全不喜欢您的异常处理策略,我宁愿将所有数据写入错误日志或数据库表,并通过一条简单的消息重定向到错误页面,通知发生了错误。用户不应被此类技术细节以及其他可能的安全问题所困扰。
      • 好的抱歉!但是我对同一个主题有两个问题,所以我问了那个。对不起!
      猜你喜欢
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2012-08-04
      • 2015-10-25
      • 2016-12-24
      • 2012-09-14
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多