Почему поведение Response.Write различается в данном сценарии?

Когда я размещаю страницу, используя следующий код, Response.write("Эй") не записывает содержимое ("Эй") на родительскую страницу

<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 родительской страницы.?

Что может быть причиной? Мне нужно написать «привет» на родительскую страницу, используя первый сценарий. Оба приложения относятся к разным доменам.

Изменить: "Привет" будет из файла CrossPage.aspx. Мне нужно написать это обратно на родительскую страницу

когда я отправляю сообщение с помощью действия формы, после обработки события Page_Load() в CrossPage.aspx URL-адрес указывает на «http://localhost:2518/Web/CrossPage.aspx", что означает, что приложение все еще находится в CrossPage.aspx и не переместилось на родительскую страницу.


person Gopi    schedule 16.06.2010    source источник
comment
Откуда взялся привет? этого нет в коде...   -  person Marc Gravell    schedule 16.06.2010
comment
Hey был своего рода подтверждением от CrossPage до родительской страницы. Родительская страница - это страница POST, первоначально переходящая в CrossPage.   -  person Gopi    schedule 16.06.2010
comment
Работает ли Response.Write в цикле for, а не Hey?   -  person used2could    schedule 16.06.2010
comment
Response.Write вышел из цикла for.   -  person Gopi    schedule 16.06.2010
comment
Вы искали разницу в обоих веб-запросах с помощью скрипача? Это может дать вам ключ к пониманию того, почему поведение отличается.   -  person Peter    schedule 16.06.2010


Ответы (5)


Вы почти сами догадались о причине:

когда я отправляю сообщение с помощью действия формы, после обработки события Page_Load() в CrossPage.aspx URL-адрес указывает на «http://localhost:2518/Web/CrossPage.aspx", что означает, что приложение все еще находится в CrossPage.aspx и не переместилось на родительскую страницу.

Ваша форма перенаправляет пользователя на CrossPage.aspx, поэтому родительская страница исчезла, теперь это предыдущая страница в истории пользователя.

Похоже, вы пытаетесь выполнить какую-то асинхронную загрузку файла. Попробуйте найти примеры загрузки файлов AJAX, например: Как я могу загрузить файлы асинхронно?

person batwad    schedule 24.08.2010

Вероятно, это потому, что у вас есть код в блоке if (!Page.IsPostBack)? этот код будет выполняться только если страница не загружена на постбэке.

(HttpWebResponse)requestToSender.GetResponse(); вызовет запрос GET, поэтому ваш код работает, когда вы вызываете Crosspage.aspx с помощью этого кода.

person Nimesh Madhavan    schedule 16.06.2010
comment
Конечно, это следует делать только при загрузке страницы, так как у меня нет событий страницы публикации на странице CrossPage.aspx. - person Gopi; 16.06.2010
comment
Get in .GetResponse() не подразумевает HTTP GET. requestToSender.Method = POST; делает это POST - person Matt; 16.07.2010

Вы относитесь к странице как к услуге. НАПРИМЕР. Начните с ParentPage.aspx > передайте данные в ServicePage.aspx для обработки > запишите ответ обратно в ParentPage.aspx для отображения.

Вы заставили его работать с C#, передав обязанности обратно серверу, где можно легко поддерживать состояние при пересечении границ страницы. Не все так просто, когда пытаешься решить задачу без C#. Это не приложение Winform. Как указал NimsDotNet, изменение метода на «get» приблизит вас, но вы будете перенаправлены на CrossPage.aspx и потеряете вызывающую страницу.

Вы сказали, что находитесь в «разных доменах». Под этим я думаю, вы имеете в виду использование двух разных серверов IIS. Решение C# должно по-прежнему работать в этом сценарии, как вы показали. Просто добавьте Response.Write() объекта fromSender. Из того, что вы нам сказали, нет ничего, что делало бы это технически невозможным. Тем не менее, если вам нужно решение на стороне клиента, вы можете использовать javascript для выполнения запроса на получение без перенаправления.

В этом сообщении показано, как сделать запрос на получение с помощью JQuery.

person P.Brian.Mackey    schedule 16.06.2010

Я говорю, что ваш aFile.SaveAs(Server.MapPath(".") + "/".... выдает исключение. Попробуйте прокомментировать его и протестировать.

ОБНОВИТЬ:

Я предполагаю, что это работает из HttpWebRequest, потому что файл не публикуется, поэтому цикл файла пропускается. при публикации из HTML у вас есть ввод файла, поэтому ваш файловый цикл используется и приводит к выполнению логики сохранения. так что еще раз, это заставляет меня думать, что это ваша логика сохранения

Кроме того, я думаю, что у вас есть оператор try catch, обернутый вокруг всего этого, который перехватывает exception, поэтому вы понятия не имеете, что происходит не так. Если это так, никогда не делайте этого. Вы редко хотите поймать exception.

После беглого просмотра логики сохранения замените "/" на @"\". Server.MapPath(".") возвращает путь, используя обратную косую черту, а не прямую косую черту.

person used2could    schedule 16.06.2010
comment
странно, я запустил код на своем конце, и он работает, как и ожидалось, с удаленной логикой сохранения. - person used2could; 16.06.2010
comment
Могу ли я узнать, какое исключение он выдает? - person Gopi; 18.06.2010
comment
Я просто закомментировал логику сохранения, потому что не тратил время на настройку каких-либо файлов для тестирования. Не было исключения. Все работало с закомментированной логикой сохранения. - person used2could; 18.06.2010
comment
Я предполагаю, что это работает из HttpWebRequest, потому что файл не публикуется, поэтому цикл файла пропускается. при публикации из HTML у вас есть ввод файла, поэтому ваш файловый цикл используется и приводит к выполнению логики сохранения. Итак, опять же, это заставляет меня думать, что это ваша логика спасения. - person used2could; 18.06.2010
comment
Это точный код, который вы используете? или вы упростили это, чтобы разместить здесь? я предполагаю, что у вас есть оператор try catch, обернутый вокруг всего этого, который перехватывает исключения, поэтому вы понятия не имеете, что происходит не так. Если это так, никогда не делайте этого. Вы редко хотите поймать исключение - person used2could; 18.06.2010
comment
Нет, у меня нет попытки поймать, и сохранение работает ОТЛИЧНО. Я завершил работу над полной функцией с помощью HTTPWebRequest и все еще использую тот же SaveAs. Выглядит действительно странно :) - person Gopi; 21.06.2010
comment
В качестве ХОРОШЕЙ практики в начальный период разработки я не использую try catch, если это не очень важно. :) - person Gopi; 21.06.2010
comment
Тем не менее я использую эту строку в своем коде... aFile.SaveAs(Server.MapPath(.) +/+ Path.GetFileName(aFile.FileName)); - person Gopi; 21.06.2010

Я бы предложил изменить CrossPage.aspx на .ashx HttpHandler. Page.IsPostBack может работать неправильно, потому что он ожидает ViewState и других скрытых полей формы ASP.net, которые сообщают ему, что это сообщение из формы ASP. Вам также не нужно проходить через все функции жизненного цикла страницы, которые проходят веб-формы ASP.net.

person Mike the Tike    schedule 06.02.2013