为什么在给定的情况下 Response.Write 的行为会有所不同?

3
当我使用以下代码进行POST请求时,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>

但是当我使用以下代码,并POST数据时,可以在父页面中获得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事件中没有任何代码。

可能是什么原因?我需要使用第一种情况将“hey”写入父页面。两个应用程序属于不同的域。

编辑:“Hey”来自CrossPage.aspx。我需要将其写回到父页面。

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


“Hello”这个词从哪里来的?它并不在代码中出现… - Marc Gravell
“Hey”是CrossPage向父页面发送的一种确认信号。父页面是最初POST到CrossPage的页面。 - Gopi
在“for循环”中,Response.Write是否起作用,只有“Hey”没有起作用? - Brian
Response.Write在for循环之外。 - Gopi
你是否使用Fiddler查看了两个Web请求之间的差异?这可能会给你一些线索,解释为什么行为不同。 - Peter
5个回答

1

你几乎自己找到了原因:

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

你的表单将用户带到CrossPage.aspx,所以父页面已经消失了,现在是用户历史记录中的上一页。

听起来你正在尝试做一些异步文件上传。尝试寻找AJAX文件上传示例,例如:如何异步上传文件?


0

我发现你的 aFile.SaveAs(Server.MapPath(".") + "/".... 抛出了一个异常。尝试注释掉它并进行测试。

更新:

我猜它从 HttpWebRequest 中起作用是因为没有文件被发送,因此文件循环被跳过了。当从 HTML 发送时,您有一个文件输入,因此您的文件循环正在使用,并导致保存逻辑被执行。所以,这让我认为是您的保存逻辑有问题。

另外,我认为您在所有这些代码周围都包装了一个 try catch 语句来捕获异常,因此您不知道出了什么问题。如果是这种情况,请永远不要这样做。您很少想要捕获 exception。

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


奇怪,我在我的端上运行了这段代码,并且在移除保存逻辑后它的表现符合预期。 - Brian
我可以知道它会抛出什么类型的异常吗? - Gopi
我猜它是从HttpWebRequest工作的,因为没有文件被发布,所以文件循环被跳过了。当从HTML发帖时,您有一个文件输入,因此您的文件循环正在使用并导致执行保存逻辑。所以再次,这让我想到它是您的保存逻辑。 - Brian
这是你正在使用的确切代码吗?还是你简化了它以便在这里发布?我猜你已经用try catch语句包装了所有这些内容,以捕获“exception”,所以你不知道出了什么问题。如果是这样的话,永远不要这样做。你很少想要捕获“exception”。 - Brian
不,我没有任何的try catch,保存工作完美无缺。我使用HTTPWebRequest完成了整个功能,并且仍然使用相同的SaveAs。看起来真的很奇怪 :) - Gopi
显示剩余3条评论

0

可能是因为您的代码位于if (!Page.IsPostBack)块中?这段代码只有在页面没有在回发时才会执行。

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


当然,它应该只在页面加载时执行,因为在CrossPage.aspx页面中我没有任何后置页面事件。 - Gopi
“.GetResponse()” 中的“Get”并不意味着HTTP GET请求。而“requestToSender.Method = "POST";”则表示它是一个POST请求。 - Matt

0

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

通过将职责传递回服务器,您已经成功使用C#使其工作,在跨页面边界时可以轻松维护状态。但是,如果您尝试在没有C#的情况下解决问题,情况就不那么简单了。这不是Winform应用程序。正如NimsDotNet指出的那样,将方法更改为“get”将使您更接近,但您将被重定向到CrossPage.aspx并且会失去调用页面。

您说您处于“不同的域”。我认为这意味着您正在使用两个不同的IIS服务器。在这种情况下,C#解决方案仍然可以像您展示的那样工作。只需添加一个fromSender对象的Response.Write()即可。您告诉我们的任何内容都不会使此技术上不可能。但是,如果您想要客户端解决方案,您可以使用JavaScript进行get请求而不会被重定向。

post向您展示如何使用JQuery进行get请求。


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接