получая эту ошибку: «Удаленный сервер возвратил ошибку: (422) Unprocessable Entity.» при выполнении поста из C # в RoR - PullRequest
2 голосов
/ 05 января 2011

Этот код предназначен для внешнего вида плагина.Мы пытаемся отправить сообщение на страницу и получаем эту ошибку:

The remote server returned an error: (422) Unprocessable Entity.

Код C # находится здесь:

webClient.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
        ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
        Byte[] postData = asciiEncoding.GetBytes("email=e2@email.com&password=hunter2");
        char[] resultHTML = asciiEncoding.GetChars(webClient.UploadData("http://url", "POST", postData));
        string convertedResultHTML = new string(resultHTML);

Есть идеи, что может быть причиной этого?

Ответы [ 5 ]

1 голос
/ 30 января 2011

Данные POST должны быть закодированы перед отправкой по проводам как ASCII, если вы отправляете символ, не входящий в диапазон ASCII.Вы должны попробовать что-то вроде:

Byte[] postData = asciiEncoding.GetBytes(HttpUtility.UrlEncode("email=e2@email.com&password=hunter2"));
1 голос
/ 26 января 2011

Из-за его ограниченной функциональности я избегаю использования WebClient и вместо него использую WebRequest.Код ниже:

  1. не ожидает возврата кода состояния HTTP 100,
  2. создает CookieContainer для хранения любых файлов cookie, которые мы получаем,
  3. устанавливает заголовок Content Length и
  4. UrlEncode s для каждого значения в данных публикации.

Попробуйте следующую попытку и посмотрите, работает ли она дляВы.

System.Net.ServicePointManager.Expect100Continue = false;
System.Net.CookieContainer cookies = new System.Net.CookieContainer();

// this first request just ensures we have a session cookie, if one exists
System.Net.WebRequest req = System.Net.WebRequest.Create("http://localhost/test.aspx");
((System.Net.HttpWebRequest)req).CookieContainer = cookies;
req.GetResponse().Close();

// this request submits the data to the server
req = System.Net.WebRequest.Create("http://localhost/test.aspx");
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
((System.Net.HttpWebRequest)req).CookieContainer = cookies;

string parms = string.Format("email={0}&password={1}", 
    System.Web.HttpUtility.UrlEncode("e2@email.com"),
    System.Web.HttpUtility.UrlEncode("hunter2"));
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(parms);
req.ContentLength = bytes.Length;

// perform the POST
using (System.IO.Stream os = req.GetRequestStream()) 
{
   os.Write(bytes, 0, bytes.Length);
}

// read the response
string response;
using (System.Net.WebResponse resp = req.GetResponse())
{
  if (resp == null) return;
  using (System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()))
  {
      response = sr.ReadToEnd().Trim();
  }
}
// the variable response holds the results of the request...

Кредиты: Гензельман , Симон (ТАК вопрос)

1 голос
/ 29 января 2011

Это приложение RoR, сообщающее, что вы не сформировали запрос, который он может обработать;целевой сценарий существует (в противном случае вы увидите 404), запрос обрабатывается (в противном случае вы получите ошибку 400), и он был закодирован правильно (или вы получите ошибку 415), но фактическая инструкция может 'не может быть выполнено.

Глядя на это, вы, кажется, загружаете некоторую информацию по электронной почте.Приложение RoR может сообщать вам, что имя пользователя и пароль неверны, или что пользователь не существует, или что-то еще.Это зависит от самого приложения RoR.

Я думаю, что сам код хорош;просто приложение на другом конце не радует то, что вы просите.Вы упускаете что-то еще в информации запроса, например команду?(например, command=getnetemails&email=e2@email.com&password=hunter2) Вы уверены, что комбинация адреса электронной почты и пароля, которую вы передаете, является правильной?

см. здесь , чтобы узнать больше об ошибке 422.

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

это было решено возвращением xml вместо неструктурированного текста на стороне RoR

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

Добавьте строку ниже над вашим кодом.

System.Net.ServicePointManager.Expect100Continue = false;

Вы пытаетесь получить доступ к странице, требующей аутентификации?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...