【问题标题】:Pass data to a URL on a different web server without the QueryString在没有 QueryString 的情况下将数据传递到不同 Web 服务器上的 URL
【发布时间】:2014-05-07 03:20:32
【问题描述】:

我有一个 .ashx 处理程序,在完成处理后,它会根据处理过程重定向到成功或错误页面。处理程序在我的站点中,但成功或错误页面可能不在(这是用户可以配置的)。

有什么方法可以将错误详细信息传递到错误页面而不将其放入查询字符串中?

我试过了:

  1. 添加包含错误详细信息的自定义标头,但由于我使用的是Response.Redirect,因此标头会被清除
  2. 使用Server.Transfer,而不是Response.Redirect,但这不适用于不在我网站中的网址

我知道我可以在查询字符串中传递数据,但在某些情况下,我需要传递的数据对于查询字符串来说可能太长了。我还有其他选择吗?

【问题讨论】:

  • 成功/错误页面如何接受数据?邮政?会话变量?
  • 把数据POST到其他页面怎么样?
  • @attila 这会怎样?如果您从处理程序发出表单发布,则响应将返回到服务器,而不是用户的浏览器窗口。之后你仍然需要使用查询字符串参数进行重定向。
  • @DStanley:如果成功/错误页面在另一个站点上,我猜会话变量可能不会那么好。
  • 我同意 - 这让您可以使用 GET(查询字符串)或 POST。

标签: c# query-string response.redirect server.transfer


【解决方案1】:

如果您必须执行重定向,则需要在查询字符串中传递一些类信息,因为这就是浏览器重定向的工作方式。不过,你可以对如何通过它有创意。

  1. 您可以传递错误代码,让消费系统知道各种错误代码的含义。
  2. 您可以传递一个令牌,并让消费系统知道如何在幕后向您的系统询问给定令牌的错误信息。

另外,如果您对它是否实际执行重定向有任何灵活性,您可以首先使用 AJAX 请求,然后发回浏览器的 javascript 可以解释并通过 POST 参数发送的某种 JSON 对象或类似的东西。

【讨论】:

  • 看起来我将使用重定向来访问外部 URL。我喜欢你对错误代码的想法我只是不确定如何让消费页面知道如何处理它们。目前,它可能只是我的内部成功/错误页面使用它,因此错误代码可以工作,对于所有可能出错的不同事情来说,这将是乏味的。理想情况下,我想以某种方式将Exception.Message 传递给页面。
  • @lhan16:向最终用户显示异常消息通常被认为是个坏主意,但我了解您的来源。您总是可以对消息或其他内容进行 base-64 编码,因此看起来整个消息都不会被发送过来。用户会在他们的 URL 上看到大量的数字和字母,但大多数用户会忽略 URL 中人类不可读的部分。与尝试保持更新的错误代码表相比,指导第三方如何解码消息会更容易。
  • 对,在这种情况下,Exception 中的消息是定制的更友好的消息,对最终用户来说是可以的。否则我完全同意。再次感谢!
【解决方案2】:

基本上,不。在 GET 请求(即重定向)中传递附加数据的唯一方法是在查询字符串中传递它。

要认识到的重要一点是,这不是 WebForms 的限制,这正是 HTTP 的工作原理。如果您要重定向到站点之外的另一个页面(因此没有 cookie/会话数据的选项),您将不得不直接在请求中发送信息,这意味着使用查询字符串。

Server.TransferResponse.Redirect 之类的东西只是对简单 HTTP 请求的抽象;没有任何框架功能可以挑战 HTTP 实际的工作原理

当然,对于在查询字符串中传递的什么,你确实有各种选项,但你必须传递一些东西。如果你真的想缩短 URL,也许你可以传递一个错误代码并公开一个 API,让接收页面获取更多信息:

  1. 将交易信息(或详细的错误消息)存储在带有 ID 的数据库中。
  2. 在查询字符串中传递 ID。
  3. 公开网络方法或类似 API 以允许接收页面请求更多信息。

您可以通过许多骇人听闻的方式创建在表单帖子之外的重定向中传递数据的错觉(例如返回包含表单和 Javascript 的页面以立即执行跨域form post) 但是查询字符串是在 GET 请求中传递数据的正确方式,那么为什么要尝试破解它呢?

【讨论】:

    【解决方案3】:

    大多数浏览器都会以 GET 方式执行重定向,这意味着您必须将数据放入查询字符串中。

    将响应作为 POST 进行“重定向”的一个技巧(发布在 twoother 答案中)是将响应转换为将自身 POST 到目标站点的表单:

    Response.Clear();
    
    StringBuilder sb = new StringBuilder();
    sb.Append("<html>");
    sb.AppendFormat(@"<body onload='document.forms[""form""].submit()'>");
    sb.AppendFormat("<form name='form' action='{0}' method='post'>",postbackUrl);
    
    <!-- POST values go here -->
    sb.AppendFormat("<input type='hidden' name='id' value='{0}'>", id);   
    
    sb.Append("</form>");
    sb.Append("</body>");
    sb.Append("</html>");
    
    Response.Write(sb.ToString());
    
    Response.End();
    

    但我会阅读两者的 cmets 以了解其局限性。

    【讨论】:

    • 值得注意的是 - 除了其他答案之外的 cmets - 我不确定在 任何 情况下推荐这个是否合适。返回带有自发布表单的页面几乎是肮脏的。
    • 谢谢。这很聪明,但确实感觉很脏。
    • 谢谢.. 你拯救了我的一天 :)
    【解决方案4】:

    基本上有两种常用的 HTTP 方式来发送一些数据 - GET 和 POST。 当您使用附加参数重定向到另一个 URL 时,您使客户端浏览器将 GET 请求发送到目标服务器。从技术上讲,您的服务器使用特定的 HTTP 错误代码 307 + 要访问的 URL(包括 GET 参数)响应浏览器。 或者,您可能想要/需要向目标 URL 发出 POST 请求。在这种情况下,您应该使用一个简单的 HTML 表单进行响应,该表单由几个预先填充了某些值的隐藏字段组成。表单的操作应该指向目标 URL,方法应该是“POST”,当然你的 HTML 应该包含 javascript,一旦加载文档,它就会自动提交表单。这样,客户端浏览器将发送 POST 请求而不是 GET 请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 2017-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多