URL для HttpWebRequest, усеченный специальными символами

#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 , так что все в порядке.