【问题标题】:Request.Form[x] values are null in a Cross-domain PostRequest.Form[x] 值在跨域帖子中为空
【发布时间】:2014-11-08 10:45:53
【问题描述】:

我在这里阅读了有关跨域帖子的一些问题和答案,但我仍然无法使其正常工作。任务看起来很简单,但我从接收端得到的数据却始终为空。

在 Web 应用程序 1(发件人)中,我有这个 TestCrossDomainPost.html:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
</head>
<body>
<form action="http://localhost:55400/TestCrossDomainReceive.aspx" method="post">
    First name: <input type="text" name="fname"><br>
    Last name: <input type="text" name="lname"><br>
    <input type="submit" value="Submit">
</form>
</body>
</html>

在 web 应用程序 2(接收器)中,我有这个 TestCrossDomainReceive.aspx(那里什么都没有):

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="TestCrossDomainReceive.aspx.cs" Inherits="WebApplication14.TestCrossDomainReceive" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>

    </div>
    </form>
</body>
</html>

和TestCrossDomainReceive.aspx.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication14
{
    public partial class TestCrossDomainReceive : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string fname = Request.Form["fname"];
            string lname = Request.Form["lname"];
        }
    }
}

当我在Page_Load 中设置调试点时,fnamelname 永远是null

我在这里想念什么?我已经调试了两天...

【问题讨论】:

  • 我无法复制。复制您的代码完全按预期工作。你能提供更多细节吗?
  • @MikeSmithDev 我修改了问题。这正是我使用的;对于实际使用的端口号,请更改为本地计算机上的任何内容。谢谢!
  • 请同时附上您的.aspx 代码。
  • 好的。那么在 POST 之后,当断点在 lname 上时,fname 的值是多少? (当断点在 fname 上时,该值尚未设置,所以是的,它将为空)。
  • 值为空。一件奇怪的事情,在断点处,它显示 Request.RequestType 是“GET”,Request.HttpMethod 是“GET”。但我在发件人中设置了“post”

标签: c# asp.net cross-domain forms http-post


【解决方案1】:

出于安全原因,浏览器通常会阻止您这样做。你可以:

  1. 如果您可以控制目标方法,请将其转换为处理“GET”并将您的 POST 更改为源域上的 GET。

  2. POST 到源域上的代理服务,然后让代理制作 POST 到目标域。

【讨论】:

  • @MikeSmithDev,我读了那篇文章,他们说我们可以做 POST。我错过了什么吗?
  • @Jonathan,浏览器禁止这样做很奇怪吗?但是当我点击发送方的按钮时,我可以到达接收方。如果他们禁止,为什么不弹出并告诉我?为什么让我通过并击中接收器?此外,我不能执行 GET,因为它显示了查询字符串中的所有内容。你能告诉我如何做代理服务吗?我不知道该怎么做。
  • @alice 不,你没有错过任何东西。这个答案是不正确的,不需要代理服务。这可能是一个 asp.net 安全问题。
  • 你不需要 dot net 来查看行为。将您的 TestCrossDomainPost 复制到一个 html 文件中。在 Chrome 中打开。启动提琴手。在 chrome 中提交表单。在 Fiddler 中检查请求。您将看到 fname 和 lname 参数。现在将 html 中的操作更改为指向 Google(跨域)。提交表格。在 Fiddler 中检查请求。没有 fname / lname 参数。目标表单没有获取参数的原因是浏览器没有发送它们。
猜你喜欢
  • 1970-01-01
  • 2012-10-12
  • 2013-09-08
  • 1970-01-01
  • 2015-10-20
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多