在http的post传输中怎样把字典编程字节流传输?

时间:2021-09-12 12:05:04
我的代码如下:但是不能把字典编程字节流??

 var parameter = new Dictionary<string, string>() {
{ "username", "username" },
{ "password", "password" }
};
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri(BaseUrl+"Login"));
            CookieContainer cookie=request.CookieContainer;
            request.KeepAlive = true;
            //上面的http头看情况而定,但是下面俩必须加   
            request.ContentType = "application/form-url-encoded";
            request.Method = "POST";
          
            Encoding encoding = Encoding.UTF8;//根据网站的编码自定义   
            byte[] postData = encoding.GetBytes(parameter);//postDataStr即为发送的数据   
            request.ContentLength = postData.Length;
            Stream requestStream = request.GetRequestStream();
            requestStream.Write(postData, 0, postData.Length);

            HttpWebResponse newresponse = (HttpWebResponse)request.GetResponse(); 

    byte[] postData = encoding.GetBytes(parameter);//postDataStr即为发送的数据  这句话好像出错了,请问如果要传递字典,怎么传?  

9 个解决方案

#1


可以传bt64
然后再转

        /// <summary> 
        /// 把 Base64 转图片
        /// </summary> 
        /// <param name="base64String"></param> 
        public MemoryStream Base64ToImage(string base64String)
        {


            // base64String.Substring(0, base64String.Length / 40 * 40) 主要是 Base64 編碼長度有規定必須是 0 或 4 的整數倍,所以為免出錯,把長度處理一下 


            byte[] imageBytes = Convert.FromBase64String(base64String);


            // byte[] imageBytes = Convert.FromBase64String(base64String.Substring(0,128)); 
            MemoryStream _ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

            // Convert byte[] to Image 
            _ms.Write(imageBytes, 0, imageBytes.Length);
            /*
            System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);

            image.Save(Server.MapPath("Report"), ImageFormat.Png);
            */
            return _ms;
        }

        // 把图片转 Base64 编码
        public string ImageToBase64(System.Drawing.Image image, System.Drawing.Imaging.ImageFormat format)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                // Convert Image to byte[] 
                image.Save(ms, format);
                byte[] imageBytes = ms.ToArray();

                // Convert byte[] to Base64 String 
                string base64String = Convert.ToBase64String(imageBytes);
                return base64String;
            }
        }

#2


可以用hashtable吗? Dictionary<string, string> 这个好像不支持序列化
    
var parameter = new Hashtable() {
                { "username", "username" },
                { "password", "password" }
            };

              Encoding encoding = Encoding.UTF8;//根据网站的编码自定义   
              
              MemoryStream ms = new MemoryStream();
              SoapFormatter formatter = new SoapFormatter();
              formatter.Serialize(ms, parameter);
              ms.Close();
              
              byte[] postData = ms.GetBuffer();

#3


Post Data能随便写吗?

#4


encoding.GetBytes 参数得是字符串。

#5


Post的参数和get的参数格式差不多都是
key1=value1&key2=value2

参考:
C# HttpWebRequest提交数据方式浅析
http://developer.51cto.com/art/200909/149995.htm

#6


引用 1 楼 liuchaolin 的回复:
可以传bt64
然后再转
C# code?1234567891011121314151617181920212223242526272829303132333435363738394041        /// <summary>         /// 把 Base64 转图片        /// </summary>         /// <param nam……

这个传进入的是字符串,不是我想要的。。。

#7


???????
我想问一下为啥要传这个呢
????

哪一家的web服务器代码,会接收这种表单提交呢?

你不会是想提交json过去把?还是你想通过hashtable构造一个表单??

#8


引用 楼主 yekeyishuo 的回复:
这句话好像出错了,请问如果要传递字典,怎么传?  

这至少需要知道两个知识。

其一,是知道“序列化/反序列化”概念。把内存对象变为低级的格式,才能跟“传送”功能(你这里就是byte[])连接上。

其二,大多数比较通用的序列化机制都是针对比较简单通用的内存对象。你在设计程序时也不要一味地纠结。例如“字典”有一大堆累赘的东西会让序列化程序出错,所以应该转换为数组(使用Linq的ToArray方法),再序列化。反过来说,数组也是使用Linq的ToDictionary方法转换为字典。

#9


引用 7 楼 wanghui0380 的回复:
???????
我想问一下为啥要传这个呢
????

哪一家的web服务器代码,会接收这种表单提交呢?


这可以作为一个接入http协议的c/s服务器。

#1


可以传bt64
然后再转

        /// <summary> 
        /// 把 Base64 转图片
        /// </summary> 
        /// <param name="base64String"></param> 
        public MemoryStream Base64ToImage(string base64String)
        {


            // base64String.Substring(0, base64String.Length / 40 * 40) 主要是 Base64 編碼長度有規定必須是 0 或 4 的整數倍,所以為免出錯,把長度處理一下 


            byte[] imageBytes = Convert.FromBase64String(base64String);


            // byte[] imageBytes = Convert.FromBase64String(base64String.Substring(0,128)); 
            MemoryStream _ms = new MemoryStream(imageBytes, 0, imageBytes.Length);

            // Convert byte[] to Image 
            _ms.Write(imageBytes, 0, imageBytes.Length);
            /*
            System.Drawing.Image image = System.Drawing.Image.FromStream(ms, true);

            image.Save(Server.MapPath("Report"), ImageFormat.Png);
            */
            return _ms;
        }

        // 把图片转 Base64 编码
        public string ImageToBase64(System.Drawing.Image image, System.Drawing.Imaging.ImageFormat format)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                // Convert Image to byte[] 
                image.Save(ms, format);
                byte[] imageBytes = ms.ToArray();

                // Convert byte[] to Base64 String 
                string base64String = Convert.ToBase64String(imageBytes);
                return base64String;
            }
        }

#2


可以用hashtable吗? Dictionary<string, string> 这个好像不支持序列化
    
var parameter = new Hashtable() {
                { "username", "username" },
                { "password", "password" }
            };

              Encoding encoding = Encoding.UTF8;//根据网站的编码自定义   
              
              MemoryStream ms = new MemoryStream();
              SoapFormatter formatter = new SoapFormatter();
              formatter.Serialize(ms, parameter);
              ms.Close();
              
              byte[] postData = ms.GetBuffer();

#3


Post Data能随便写吗?

#4


encoding.GetBytes 参数得是字符串。

#5


Post的参数和get的参数格式差不多都是
key1=value1&key2=value2

参考:
C# HttpWebRequest提交数据方式浅析
http://developer.51cto.com/art/200909/149995.htm

#6


引用 1 楼 liuchaolin 的回复:
可以传bt64
然后再转
C# code?1234567891011121314151617181920212223242526272829303132333435363738394041        /// <summary>         /// 把 Base64 转图片        /// </summary>         /// <param nam……

这个传进入的是字符串,不是我想要的。。。

#7


???????
我想问一下为啥要传这个呢
????

哪一家的web服务器代码,会接收这种表单提交呢?

你不会是想提交json过去把?还是你想通过hashtable构造一个表单??

#8


引用 楼主 yekeyishuo 的回复:
这句话好像出错了,请问如果要传递字典,怎么传?  

这至少需要知道两个知识。

其一,是知道“序列化/反序列化”概念。把内存对象变为低级的格式,才能跟“传送”功能(你这里就是byte[])连接上。

其二,大多数比较通用的序列化机制都是针对比较简单通用的内存对象。你在设计程序时也不要一味地纠结。例如“字典”有一大堆累赘的东西会让序列化程序出错,所以应该转换为数组(使用Linq的ToArray方法),再序列化。反过来说,数组也是使用Linq的ToDictionary方法转换为字典。

#9


引用 7 楼 wanghui0380 的回复:
???????
我想问一下为啥要传这个呢
????

哪一家的web服务器代码,会接收这种表单提交呢?


这可以作为一个接入http协议的c/s服务器。