HttpWebRequest с POST и GET одновременно - PullRequest
3 голосов
/ 01 ноября 2010

Мне нужно перенаправить пользователя на http://www.someurl.com? Id = 2 , используя метод POST. Возможно ли это? Если да, то как?

Сейчас у меня есть следующее, и оно корректно передает данные POST, но оно удаляет? Id = 2:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.someurl.com?id=2");
request.Method = WebRequestMethods.Http.Post;
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;

using (StreamWriter writer = new StreamWriter(request.GetRequestStream()))
{
    writer.Write(postData);
}

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
    Response.Write(reader.ReadToEnd());
}

Причина, по которой мне нужны данные строки запроса ->? Id = 2 и данные POST, заключается в том, что я передаю строку запроса на страницу, на которой javascript будет обрабатывать данные строки запроса, а .NET будет работать с данными отправлено методом POST. Данные POST, которые я передаю, могут быть длиннее максимального количества символов, которое допускает метод GET, поэтому я не могу использовать только метод GET ... так что вы предлагаете?

Дополнительная информация: Я пишу страницу маршрутизации, которая добавляет некоторую настраиваемую информацию в строку запроса, а затем направляет все данные, старые и новые, далее по некоторому предоставленному URL. Эта страница должна иметь возможность перенаправления на наш сервер, а также на чей-либо сервер, и ей не нужно знать, откуда она взялась или куда она идет, ей просто нужно хранить ту же информацию о POST, GET и HEADER, а также дополнительная информация, полученная на этом этапе.

Ответы [ 8 ]

2 голосов
/ 01 ноября 2010

Нет. Нет никакой непонятной причины смешивать POST и GET.

Если вам нужно сделать параметры, передаваемые в запросе, доступными для Javascript, просто отправьте их на сервер, и сервер выложит соответствующую информацию в скрытое поле ...

<input type="hidden" value="id=2,foo=bar" disabled="disabled" />

Просто так.

Примечание: отключите скрытое поле, чтобы исключить его из последующего POST, если оно есть;)

1 голос
/ 02 ноября 2010

Учитывая дополнительную информацию по вашему вопросу, которую вы должны представить во внешний источник, я считаю, что вы должны сделать это обработать все данные и вернуть форму со скрытыми полями.Добавьте JavaScript, чтобы отправить эту форму на внешний URL-адрес сразу после загрузки.Обратите внимание, что вы не сможете загружать файлы таким способом, но вы можете соответствующим образом обрабатывать данные POST и GET.

1 голос
/ 01 ноября 2010

Проблема, я думаю, что проблема может заключаться в том, что postData не содержит параметр id, так как он предоставляется через строку запроса.

Отправленные данные находятся в теле запроса, а данные строки запроса - в URL.

Возможно, вам нужно извлечь идентификатор из request.querystring в вашу переменную postdata.

0 голосов
/ 19 января 2011

На самом деле я смог достичь желаемого результата, смешав код Javascript и Codebehind. Итак, что я сделал, так это серверный код, который создал целую веб-страницу, например:

    var strForm = new StringBuilder();
    strForm.Append("<form id=\"" + formId + "\" name=\"" + formId + "\" action=\"" + url + queryString +"\" method=\"POST\">");
    foreach (string key in data)
    {
        strForm.Append("<input type=\"hidden\" name=\"" + key + "\" value=\"" + data[key].Replace("\"", "&quot;") + "\">");
    }
    strForm.Append("</form>");

И в дополнение к этой форме, построенной на стороне сервера, я добавляю код javascript, который отправляет только что созданную форму.

    var strScript = new StringBuilder();
    strScript.Append("<script language='javascript'>");
    strScript.Append("var v" + formId + " = document." + formId + ";");
    strScript.Append("v" + formId + ".submit();");
    strScript.Append("</script>");
    strForm.Append("</form>");

Итак, что делает этот код, как вы видите, действие формы - это URL с прикрепленными к нему параметрами строки запроса ... но так как метод формы - POST, мы добавляем значения, которые мы добавили, как скрытые поля как Параметры POST ... Итак, мы в конечном итоге предоставляем параметры POST и GET.

Надеюсь, это решение кому-нибудь поможет =)

0 голосов
/ 01 ноября 2010

Что вы на самом деле пытаетесь сделать, это перенаправить ваши данные POST. Могу я спросить, почему? Я не вижу причин, по которым вы хотели бы сделать это, если на самом деле обе страницы находятся на ваших серверах.

Что вам нужно сделать, это обработать все ваши данные POST в скрипте # 1, а затем перенаправить на что-то вроде script2.aspx? Id = 234, где идентификатор 234 связан с данными вашей базы данных. Затем вы можете вызвать его позже в script2 и выгрузить все данные в переменные Javascript для использования на стороне клиента.

В любом случае, что-то в этом процессе звучит для меня подозрительно. Смешивать обработку данных на стороне клиента и на стороне сервера - все равно что смешивать водку и молоко. Это редко работает хорошо. (Но белые русские, конечно, вкусно!)

0 голосов
/ 01 ноября 2010

Попробуйте отправить все данные, включая идентификатор в POST.Затем, когда вы обрабатываете данные в C #, вы можете прочитать переменную id и записать ее обратно на свою веб-страницу в теге:

<script type="text/javascript">
  id = <%=request_id%> 
</script>

Затем просто убедитесь, что ваш JavaScript запускается после полной загрузки свызов onload () и все готово.

0 голосов
/ 01 ноября 2010

Ближайший ответ, который я нашел на эту проблему, здесь, но он не прозрачен для пользователя, поэтому он недостаточно хорош для меня -> Response.Redirect с POST вместо Get?

Если у кого-то есть другие предложения, пожалуйста, ответьте!

0 голосов
/ 01 ноября 2010

Насколько я знаю, невозможно перенаправить с помощью POST. Не могли бы вы просто притвориться (внутренне обработать так, как будто), что был сделан запрос к странице, на которую вы хотите перенаправить пользователя?

...