#c# #httpwebrequest #urlencode
#c# #httpwebrequest #urlencode
Вопрос:
URL веб-службы, которую мне нужно вызвать, включает параметр, который включает текст в произвольной форме. Я не уверен, почему он был разработан таким образом, поскольку он отправляется с использованием POST и включает в себя множество полей как часть POST. Но это вызывает у меня проблему.
Для некоторых символов, таких как знак фунта и < >, URL-адрес усекается, когда он попадает в проблемный символ. Я кодирую текст в HTML для параметра, но проблема остается. Я вижу, что специальные символы, такие как>, кодируются во что-то вроде >. Я думаю, что точка с запятой в закодированной строке каким-то образом является проблемой.
Я помещаю сниффер, принимающий входящий запрос на сервере, и я вижу там, что URL был усечен.
На сервере я вижу что-то вроде:
...?extraData=kjfkfjslkj
вместо:
...?extraData=kjfkfjslkj#kfjkdlsfj
Код выглядит примерно так:
using System.Web;
....
String strExtra="kjfkfjslkj#kfjkdlsfj";
strURL = strStuff "?extraData=" System.Web.HttpUtility.HtmlEncode(strExtra);
HttpWebRequest oRequest = (HttpWebRequest)WebRequest.Create(new Uri(strURL));
oRequest.Method = httpMethod;
oRequest.ContentType = "application/atom xml";
...
using (WebResponse oResponse = oRequest.GetResponse())
{
...
}
Ответ №1:
Все, что после знака хэша ( #
), не отправляется на сервер. Он используется браузером и скриптами на странице для обозначения местоположения на странице или какого-либо другого значения. Удалите знак хэша или закодируйте URL-адрес ( #
), чтобы отправить его на сервер.
Эта строка:
strURL = strStuff "?extraData=" System.Web.HttpUtility.HtmlEncode(strExtra);
должно быть
strURL = strStuff "?extraData=" Server.UrlEncode(strExtra);
кодирование для html бесполезно при использовании данных в URL.
Комментарии:
1. ДА. У меня это сработало. Единственное отличие в том, что я использовал System.Web.HttpUtility. UrlEncode()
2.
Page.Server
Свойство имеет типHttpServerUtility
, и методыUrlEncode
/UrlDecode
фактически передают вызов черезHttpUtility.UrlEncode
/HttpUtility.UrlDecode
, так что все в порядке.