使用Post方法将HashTable值作为Web请求传递时出现问题

时间:2011-08-02 12:38:22

标签: c# post httpwebrequest hashtable

我正在使用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请求传递。

2 个答案:

答案 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());
    }