收到此错误:“远程服务器返回错误:(422)不可处理的实体。”从C#发帖到RoR

时间:2011-01-05 03:08:42

标签: c# post outlook

此代码适用于outlook插件。我们正在尝试POST到页面并收到此错误:

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 个答案:

答案 0 :(得分:1)

由于功能有限,我避免使用WebClient而是使用WebRequest。以下代码:

  1. 不期望返回HTTP 100状态代码,
  2. 创建CookieContainer来存储我们提取的任何Cookie,
  3. 设置内容长度标头和
  4. UrlEncode发布数据中的每个值。
  5. 尝试以下内容,看看它是否适合您。

    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...
    

    致谢:HanselmanSimon(SO问题)

答案 1 :(得分:1)

这是RoR应用程序,告诉您尚未形成可以处理的请求;目标脚本存在(否则你会看到404),正在处理请求(否则你会得到400错误)并且它已被正确编码(或者你得到415错误)但实际指令可以'执行。

看着它,您似乎正在加载一些电子邮件信息。 RoR应用程序可能会告诉您用户名和密码错误,或用户不存在或其他内容。这取决于RoR应用程序本身。

我认为代码本身很好;只是在另一端的应用程序不满意你做的事情。您是否在请求信息中遗漏了其他内容,例如命令? (例如command=getnetemails&email=e2@email.com&password=hunter2)您确定要传递的电子邮件/密码组合是否合适?

有关422错误的更多信息,请参阅here

答案 2 :(得分:1)

如果要发送的字符不在ASCII范围内,则必须先编码POST数据,然后再将其作为ASCII格式发送出去。你应该尝试类似的东西:

Byte[] postData = asciiEncoding.GetBytes(HttpUtility.UrlEncode("email=e2@email.com&password=hunter2"));

答案 3 :(得分:0)

在代码上方添加以下行。

System.Net.ServicePointManager.Expect100Continue = false;

您是否尝试访问需要身份验证的页面?

答案 4 :(得分:0)

它通过返回xml而不仅仅是RoR端的非结构化文本来解决