【问题标题】:Why Response.Write behavior varies in the given scenario?为什么 Response.Write 行为在给定场景中会有所不同?
【发布时间】:2011-03-04 10:27:07
【问题描述】:

当我使用以下代码发布页面时,Response.write("Hey") 不会将内容(“Hey”)写入父页面

<form method="post" name="upload" enctype="multipart/form-data"
action="http://localhost:2518/Web/CrossPage.aspx" >
<input type="file" name="filename" />
<input type="submit" value="Upload Data File" name="cmdSubmit" />
</form>

但是当我使用以下代码,并发布数据时,可以在父页面中获取 Response.write("Hey")

 HttpWebRequest requestToSender = (HttpWebRequest)WebRequest.Create("http://localhost:2518/Web/CrossPage.aspx");
 requestToSender.Method = "POST";
 requestToSender.ContentType = "multipart/form-data";

 HttpWebResponse responseFromSender = (HttpWebResponse)requestToSender.GetResponse();
 string fromSender = string.Empty;

 using (StreamReader responseReader = new StreamReader(responseFromSender.GetResponseStream()))
    {
        fromSender = responseReader.ReadToEnd();
    }

在 CrossPage.aspx 我有以下代码

 if (!Page.IsPostBack)
    {
        NameValueCollection postPageCollection = Request.Form;

        foreach (string name in postPageCollection.AllKeys)
        {
            Response.Write(name + " " + postPageCollection[name]);
        }

        HttpFileCollection postCollection = Request.Files;
        foreach (string name in postCollection.AllKeys)
        {
            HttpPostedFile aFile = postCollection[name];
            aFile.SaveAs(Server.MapPath(".") + "/" + Path.GetFileName(aFile.FileName));
        }

        Response.Write("Hey");
    }

我在父页面的Page_Load事件中没有任何代码。?

可能是什么原因?我需要使用第一个场景将“嘿”写到父页面。两个应用程序属于不同的域。

编辑:“嘿”来自 CrossPage.aspx。我需要把它写回父页面

当我使用表单操作发布时,在处理 CrossPage.aspx 中的 Page_Load() 事件后,URL 指向“http://localhost:2518/Web/CrossPage.aspx”,这意味着应用程序仍在 CrossPage.aspx 中并且没有移动到父级页面。

【问题讨论】:

  • “你好”从何而来?这不在代码中...
  • “嘿”是从交叉页面到父页面的一种确认。父页面是最初对 CrossPage 的 POST 页面
  • “for 循环”中的 Response.Write 是否有效,而只是 Hey 无效?
  • Response.Write 不在 for 循环中。
  • 您是否使用 fiddler 查找过两个 webrequest 的区别?它可能会为您提供有关行为为何不同的线索。

标签: c# asp.net cross-domain response.write


【解决方案1】:

我说你的 aFile.SaveAs(Server.MapPath(".") + "/".... 抛出异常。尝试将其注释掉并测试它。

更新:

我猜它可以通过 HttpWebRequest 工作,因为没有发布文件,因此跳过了文件循环。从 HTML 发布时,您有一个文件输入,因此您的文件循环被使用并导致执行保存逻辑。再说一次,这让我认为这是你的保存逻辑

另外,我认为你有一个 try catch 声明围绕着所有这些正在捕获 exception 所以你不知道出了什么问题。如果是这样的话,永远不要那样做。你很少想赶上exception

快速浏览一下你的保存逻辑后,将"/" 替换为@"\"Server.MapPath(".") 使用反斜杠而不是正斜杠返回路径。

【讨论】:

  • 奇怪,我最后运行了代码,它按预期运行,删除了保存逻辑。
  • 我能知道它抛出了什么样的异常吗?
  • 我只是注释掉了保存逻辑,因为我没有花时间设置任何文件进行测试。也不例外。这一切都与注释掉的保存逻辑一起工作。
  • 我猜它可以通过 HttpWebRequest 工作,因为没有文件被发布,因此文件循环被跳过。从 HTML 发布时,您有一个文件输入,因此您的文件循环被使用并导致执行保存逻辑。再说一次,这让我认为这是你的保存逻辑。
  • 这是您使用的确切代码吗?还是您简化了在此处发布?我猜你有一个 try catch 语句包裹着所有这些捕捉“异常”的东西,所以你不知道出了什么问题。如果是这样的话,永远不要那样做。你很少想捕捉“异常”
【解决方案2】:

可能是因为你有代码 if (!Page.IsPostBack) 块?只有页面未在回发时加载,才会执行此代码。

(HttpWebResponse)requestToSender.GetResponse(); 将触发 GET 请求,这就是当您使用该代码调用 Crosspage.aspx 时您的代码可以正常工作的原因。

【讨论】:

  • 当然它应该只在页面加载时执行,因为我在 CrossPage.aspx 页面中没有任何发布页面事件
  • .GetResponse() 中的“Get”并不意味着 HTTP GET。 requestToSender.Method = "POST";使它成为一个帖子
【解决方案3】:

您将页面视为服务。例如。从 ParentPage.aspx 开始 > 将数据传递给 ServicePage.aspx 进行处理 > 将响应写回 ParentPage.aspx 进行显示。

您可以通过将职责传回服务器来使其与 C# 一起使用,这样在跨越页面边界时可以轻松地维护状态。当您尝试在没有 C# 的情况下解决问题时,情况并非如此简单。这不是 Winform 应用程序。正如 NimsDotNet 指出的那样,将方法更改为“get”将使您更接近,但您将被重定向到 CrossPage.aspx 并丢失调用页面。

您说您在“不同的域”上。我认为您的意思是您使用两个不同的 IIS 服务器。正如您所展示的,C# 解决方案仍应在此场景中工作。只需添加 fromSender 对象的 Response.Write() 即可。您没有告诉我们这在技术上是不可能的。不过,如果您想要一个客户端解决方案,您可以使用 javascript 来发出 get 请求而不会被重定向。

post 向您展示了如何使用 JQuery 发出 get 请求。

【讨论】:

    【解决方案4】:

    你几乎自己找到了原因:

    当我使用表单操作发布时,在处理 CrossPage.aspx 中的 Page_Load() 事件后,URL 指向“http://localhost:2518/Web/CrossPage.aspx”,这意味着应用程序仍在 CrossPage.aspx 中并且没有移动到父级页面。

    您的表单将用户带到 CrossPage.aspx,因此父页面消失了,现在是用户历史记录中的上一页。

    听起来您正在尝试进行某种异步文件上传。尝试寻找 AJAX 文件上传示例,如下所示:How can I upload files asynchronously?

    【讨论】:

      【解决方案5】:

      我建议将 CrossPage.aspx 更改为 .ashx HttpHandler。 Page.IsPostBack 可能无法正常工作,因为它期望 ViewState 和其他隐藏的 ASP.net 表单字段告诉它它是来自 ASP 表单的回发。您也不需要经历 ASP.net Webforms 经历的整个页面生命周期功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-01
        • 1970-01-01
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多