为什么Response.Write行为在给定方案中有所不同?

时间:2010-06-16 11:51:45

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

当我使用以下代码发布页面时,Response.write(“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”写入Parent页面。这两个应用程序属于不同的域。

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

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

5 个答案:

答案 0 :(得分:1)

你几乎找不到理由:

  

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

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

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

答案 1 :(得分:0)

我说你的aFile.SaveAs(Server.MapPath(“。”)+“/”....正在抛出异常。尝试将其评论并进行测试。

UPDATE:

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

另外,我认为你有一个try catch语句包含所有这些正在捕捉exception所以你不知道出了什么问题。如果是这样的话,永远不要这样做。你很少想要抓住exception

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

答案 2 :(得分:0)

可能是因为你有一个代码 if (!Page.IsPostBack)阻止?只有页面没有加载回发后才会执行此代码。

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

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