2011-01-05 14 views
2

このコードはOutlookプラグイン用です。私たちは、ページに投稿しようとしていると、このエラーを取得していますこのエラーが発生しました:「リモートサーバーがエラーを返しました:(422)Unprocessable Entity」 C#からRoRへのポストを行うとき

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 protected]&password=hunter2"); 
     char[] resultHTML = asciiEncoding.GetChars(webClient.UploadData("http://url", "POST", postData)); 
     string convertedResultHTML = new string(resultHTML); 

これを引き起こしている可能性がどのような任意のアイデア?

答えて

0

コードの上に次の行を追加してください。

認証に必要なページにアクセスしようとしていますか?

+0

上だけではなく、非構造化テキストのXMLを返すことによって解決された:あなたのような何かを試してみてください。私は何もしないが、Outlookプラグインによって投稿され、テキストをレンダリングするレールコントローラ上のルビーにアクセスしています。ロジックは全く関わっていません。 – tipu

1

機能が制限されているため、WebClientを使用せず、代わりにWebRequestを使用します。以下のコード:

  1. 返されるHTTP 100のステータスコードを期待していない、
  2. コンテンツの長さヘッダーを設定し、我々は拾う任意のクッキーを保存するためにCookieContainerを作成し、
  3. 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("[email protected]"), 
    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

これは、あなたがそれを扱うことができるという要求を形成していないことを知らせるRoRのアプリケーションです。 (またはそうでなければ400エラーが発生します)、正しくエンコードされている(または415エラーが発生しています)が、実際の命令では '遂行される。

これを見ると、いくつかの電子メール情報がロードされているようです。 RoRアプリケーションは、ユーザ名とパスワードが間違っていること、またはユーザが存在しないこと、または何か他のことを伝える可能性があります。それはRoRアプリケーション自体に任されています。

私はコード自体が良いと思います。それはちょうど反対側のアプリがあなたがそれを求めることについて幸せではないということです。コマンドのように要求情報に何か他のものがありませんか? (例:command=getnetemails&[email protected]&password=hunter2)渡す電子メールとパスワードの組み合わせは良いですか?

422エラーの詳細については、hereを参照してください。

1

POSTデータは、ASCII範囲以外の文字を送信する場合は、ASCII形式でワイヤに送信する前にエンコードする必要があります。

Byte[] postData = asciiEncoding.GetBytes(HttpUtility.UrlEncode("[email protected]&password=hunter2")); 
+0

各パラメータの値を個別にエンコードする必要があります –

0

それは私が、私はまだ同じエラーを取得することを加えたRoRの側

+0

レスポンスの構造を変更することで、リクエストの処理中にエラーがどのように解決されますか?私はあなたのアプリが500エラーを返すと思っていたでしょう。 – arcain

関連する問題