我正在使用C#在asp.net中开发一个Web表单,将一些数据发布到其他站点。我在使用StreamWriter传递存储在哈希表中的数据时遇到问题。 以下是我用于在HashTable中存储数据并使用HttpWebRequest发布到其他站点的代码片段。 1) //用于存储数据的哈希表
Hashtable
post_parameters = new Hashtable();
post_parameters.Add("format", "atom");
post_parameters.Add("user[first_name]", "ABC");
post_parameters.Add("user[last_name]", "XYZ");
post_parameters.Add("client_id", "1111111");
post_parameters.Add("user[salutation]", "Mr.");
post_parameters.Add("user[account_attributes][addresses_attributes][0][street]", "Street");
post_parameters.Add("user[account_attributes][addresses_attributes][0][street2]", "Street2");
post_parameters.Add("user[account_attributes][addresses_attributes][0][city]", "New York");
post_parameters.Add("user[account_attributes][addresses_attributes][0][state]", "NY");
post_parameters.Add("user[account_attributes][addresses_attributes][0][postal_code]", "10017");
post_parameters.Add("user[account_attributes][addresses_attributes][0][country_code]", "US");
post_parameters.Add("user[mapbuzz_auth_attributes][email]", abc.xyz@xyz.com);
post_parameters.Add("user[employee_attributes][position]", "Consultant");
post_parameters.Add("user[employee_attributes][company_attributes][name]", "XYZ");
2) //使用HttpWebRequest发送数据的方法
Uri uri = new Uri(http://www.xyz.com/user + "?" + query_string);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.Method = WebRequestMethods.Http.Post;
request.ContentType =
"application/x-www-form-urlencoded";
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write(post_parameter);
writer.Close();
HttpWebResponse
response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream());
string tmp = reader.ReadToEnd();
response.Close();
Response.Write(tmp);
问题:
我得到一个响应为“422 unprocessable entity”,用于传递HashTable作为参数。 请提供相关帮助,并告诉我如何将Hashtable作为Web请求传递。
答案 0 :(得分:1)
从the wiki article on HTTP POST开始,可以阅读以下内容
当Web浏览器从Web表单元素发送POST请求时,标准Internet媒体类型为“application / x-www-form-urlencoded”。这是一种用于编码具有可能重复键的键值对的格式。每个键值对由'&'分隔字符,每个键与其值分隔一个'='字符。通过用“+”字符替换空格然后对所有其他非字母数字字符使用URL编码来转义键和值。
因此,要获取哈希表,您需要将其写入请求正文
format=atom&user[first_name]=ABC&user[last_name]=XYZ.... /etc
您需要将其插入到此段代码中:
StreamWriter writer = new StreamWriter(request.GetRequestStream());
writer.Write("format=atom&user[first_name]=ABC&user[last_name]=XYZ");
writer.Close();
最后,您可以轻松地将HashTable
转换为该表单或字符串:
String.Join("&", post_parameters.OfType<DictionaryEntry>().Select(de => String.Format("{0}={1}", de.Key, de.Value)));
答案 1 :(得分:0)
您现在只发送System.Collections.Hashtable类的名称。也许你的目的是实现这个目标:
foreach (var item in post_parameters)
{
writer.Write(item.GetHashCode());
}