将数据传递到不使用QueryString的其他Web服务器上的URL

时间:2014-03-27 21:34:30

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

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

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

我试过了:

  1. 添加包含错误详细信息的自定义标头,但由于我使用Response.Redirect,标头会被清除
  2. 使用Server.Transfer代替Response.Redirect,但这不适用于不在我网站中的网址
  3. 我知道我可以在查询字符串中传递数据,但在某些情况下,我需要传递的数据对于查询字符串来说可能太长了。我还有其他选择吗?

4 个答案:

答案 0 :(得分:2)

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

  1. 您可以传递错误代码,让消费系统了解各种错误代码的含义。
  2. 您可以传递令牌,并让消费系统知道如何向您的系统询问幕后给定令牌的错误信息。
  3. 此外,如果您对它是否实际执行重定向有任何灵活性,您可以首先使用AJAX请求,并发送回某种JSON对象,浏览器的javascript可以通过POST参数或类似的东西来解释和发送。

答案 1 :(得分:2)

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

要认识到的重要一点是,这不是WebForms的限制,这就是HTTP的工作原理。如果您要重定向到您网站之外的其他网页(因此无法选择Cookie /会话数据),您将不得不直接发送信息请求,这意味着使用查询字符串。

Server.TransferResponse.Redirect之类的东西只是对简单HTTP请求的抽象;没有框架功能可以违反HTTP 实际工作的方式

当然,您可以在查询字符串中提供 的所有选项,但是您必须传递一些东西。如果你真的想缩短网址,也许你可以传递错误代码并公开一个API,让接收页面获取更多信息:

  1. 将交易信息(或详细的错误消息)存储在带有ID的数据库中。
  2. 在查询字符串中传递ID。
  3. 公开网络方法或类似的API,以允许接收页面请求其他信息。
  4. 有很多hacky方法可以创建在表单帖子之外的重定向中传递数据的幻觉(例如返回包含表单和Javascript的页面以立即执行跨域form post)但是查询字符串是在GET请求中传递数据的正确的方式,那么为什么要尝试破解呢?

答案 2 :(得分:1)

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

作为POST执行“重定向”的一个技巧(在two other答案中发布)是将响应转换为将自身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();

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

答案 3 :(得分:0)

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