WebRequest设置Header应该放最前面

WebRequest设置Header应该放最前面,如果先设置RequestBody,可能会破坏Header,造成服务器不能正确读取,即使跟踪查看header的数据都存在

public static byte[] request(string url, string method, ref Dictionary<string, string> header,object data = null, string encoding = "utf-8")
        {
            HttpWebResponse response = null;
            Stream stream = null;
            MemoryStream memoryStream = null;
            try
            {                
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.Method = method.ToUpper();

                if (header != null)
                {
                    foreach (string key in header.Keys)
                    {
                        request.Headers.Add(key, header[key]);
                    }
                }
                header = null;

                if (data != null)
                {
                    byte[] bytesRequestData = null;
                    if (data is Dictionary<string, object>)
                    {
                        if (request.ContentType == null)
                            request.ContentType = "application/x-www-form-urlencoded";
                        bytesRequestData = Encoding.Default.GetBytes(createQueryStringUrlEncode((Dictionary<string, object>)data, Encoding.GetEncoding(encoding)));
                    }
                    else if (data is string)
                    {
                        bytesRequestData = Encoding.Default.GetBytes(data as string);
                    }
                    else
                    {
                        BinaryFormatter bf = new BinaryFormatter();
                        memoryStream = new MemoryStream();
                        bf.Serialize(memoryStream, data);
                        bytesRequestData = memoryStream.GetBuffer();
                        memoryStream.Close();
                        memoryStream.Dispose();
                        memoryStream = null;
                    }
                    request.ContentLength = bytesRequestData.Length;
                    Stream requestStream = request.GetRequestStream();
                    requestStream.Write(bytesRequestData, 0, bytesRequestData.Length);
                    requestStream.Close();
                }

                response = (HttpWebResponse)request.GetResponse();
                stream = response.GetResponseStream();
                header = new Dictionary<string, string>();
                foreach (string key in response.Headers.Keys)
                {
                    header.Add(key, response.Headers[key]);
                }

                header["StatusCode"] = response.StatusCode.ToString();
                header["StatusDescription"] = response.StatusDescription;

                if(stream.CanRead)
                {
                    byte[] buffer = new byte[1024];
                    int len = 0;
                    memoryStream = new MemoryStream();
                    while ((len = stream.Read(buffer, 0, 1024)) > 0)
                    {
                        memoryStream.Write(buffer, 0, len);
                    }
                    return memoryStream.GetBuffer();
                }
                return null;
            }catch(WebException ex){
                response = (HttpWebResponse)ex.Response;
                header = new Dictionary<string, string>();
                foreach (string key in response.Headers.Keys)
                {
                    header.Add(key, response.Headers[key]);
                }
                header["StatusCode"] = response.StatusCode.ToString();
                header["StatusDescription"] = response.StatusDescription;
                return null;
            }
            catch (Exception ex)
            {
                return null;
            }
            finally
            {
                if (memoryStream != null)
                {
                    memoryStream.Close();
                    memoryStream.Dispose();
                }
                if (stream != null)
                {
                    stream.Close();
                    stream.Dispose();
                }
                if (response != null)
                {
                    response.Close();
                    response.Dispose();
                }
            }
        }
原文地址:https://www.cnblogs.com/freewing/p/5133623.html