此代码适用于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);
知道可能导致这种情况的原因吗?
答案 0 :(得分:1)
由于功能有限,我避免使用WebClient
而是使用WebRequest
。以下代码:
CookieContainer
来存储我们提取的任何Cookie,UrlEncode
发布数据中的每个值。尝试以下内容,看看它是否适合您。
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 :(得分: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端的非结构化文本来解决