本地测试通过,服务器出现乱码

本地测试通过,服务器发布出现乱码 ,后面检查发现Http请求发送存在编码问题

改进了一下请求基类:

using System;
using System.Collections.Generic;
using System.Web;
using System.Text;
using System.Net;
using System.IO;
using System.IO.Compression;
using System.Text.RegularExpressions;

namespace common
{
    public class HttpUtil
    {
        public string HttpPost(string url, string data, Encoding encoding)
        {
            return HttpPost(url, data, "text/plain", encoding);
        }

        public string HttpGet(string url, Encoding encoding)
        {
            return HttpSend(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET");
        }
        public string HttpGet(string url, Encoding encoding, string Strcompress)
        {
            return HttpSend(url, "", "text/plain", Encoding.GetEncoding("utf-8"), "GET", null, Strcompress);
        }

        public string HttpGet(string url, string contenttype, Encoding encoding)
        {
            return HttpSend(url, "", contenttype, Encoding.GetEncoding("utf-8"), "GET");
        }

        public string HttpPost(string url, string data, string contenttype, Encoding encoding, Dictionary<string, string> Headers = null)
        {
            return HttpSend(url, data, contenttype, encoding, "POST", Headers);
        }

        private string HttpSend(string url, string data, string contenttype, Encoding encoding, string method, Dictionary<string, string> Headers = null, string Strcompress = "")
        {
            try
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
                request.Method = method;
                if (!string.IsNullOrEmpty(contenttype))
                    request.ContentType = contenttype;
                //设置Header信息
                if (Headers != null && Headers.Count > 0)
                {
                    foreach (KeyValuePair<string, string> item in Headers)
                        if (!string.IsNullOrEmpty(item.Key) && !string.IsNullOrEmpty(item.Value))
                            request.Headers.Add(item.Key, item.Value);
                }
                if (data != "")
                {
                    byte[] bs = encoding.GetBytes(data);
                    request.ContentLength = bs.Length;
                    request.Timeout = 120 * 1000;
                    using (Stream reqStream = request.GetRequestStream())
                    {
                        reqStream.Write(bs, 0, bs.Length);
                    }
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();

                Stream stream = response.GetResponseStream();

                if (Strcompress == "gzip")
                    stream = new GZipStream(stream, CompressionMode.Decompress);
                //if (response.ContentEncoding.ToLower().Contains("gzip"))
                //    stream = new GZipStream(stream, CompressionMode.Decompress);
                //else if (response.ContentEncoding.ToLower().Contains("deflate"))
                //    stream = new DeflateStream(stream, CompressionMode.Decompress);

                MemoryStream memoryStream = new MemoryStream();
                int bufferLength = 1024;
                byte[] b = new byte[bufferLength];

                int actual;

                while ((actual = stream.Read(b, 0, bufferLength)) > 0)
                {
                    memoryStream.Write(b, 0, actual);
                }
                memoryStream.Position = 0;

                byte[] bt = memoryStream.ToArray();

                //无视编码
                //if (encoding == null)
                //{
                string temp = Encoding.Default.GetString(bt, 0, bt.Length);
                //<meta(.*?)charset([\s]?)=[^>](.*?)>
                Match meta = Regex.Match(temp, "<meta([^<]*)charset=([^<]*)[\"‘]", RegexOptions.IgnoreCase | RegexOptions.Multiline);
                string charter = (meta.Groups.Count > 2) ? meta.Groups[2].Value : string.Empty;
                charter = charter.Replace("\"", string.Empty).Replace("‘", string.Empty).Replace(";", string.Empty);
                if (charter.Length > 0)
                {
                    charter = charter.ToLower().Replace("iso-8859-1", "gbk");
                    encoding = Encoding.GetEncoding(charter);
                }
                else
                {
                    if (response.CharacterSet.ToLower().Trim() == "iso-8859-1")
                    {
                        encoding = Encoding.GetEncoding("gbk");
                    }
                    else
                    {
                        if (string.IsNullOrEmpty(response.CharacterSet.Trim()))
                        {
                            encoding = Encoding.UTF8;
                        }
                        else
                        {
                            encoding = Encoding.GetEncoding(response.CharacterSet);
                        }
                    }
                }
                //}

                stream.Close();
                stream.Dispose();
                response.Close();

                return encoding.GetString(bt);
            }
            catch (Exception e)
            {
                LogUtils.Debug(e.Message);
                return "";
            }
        }

        /// <summary>
        /// 以指定编码通过POST方式发送数据。
        /// </summary>
        /// <param name="Url">url</param>
        /// <param name="postString">Post数据</param>
        /// <returns></returns>
        public string PostString(string Url, string postString, Encoding ed)
        {
            var data = ed.GetBytes(postString);

            var request = (HttpWebRequest)WebRequest.Create(Url);
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = data.Length;
            using (var wStream = request.GetRequestStream())
            {
                wStream.Write(data, 0, data.Length);
            }

            var response = (HttpWebResponse)request.GetResponse();
            var rt = string.Empty;
            using (var rStream = new StreamReader(response.GetResponseStream(), ed))
            {
                rt = rStream.ReadToEnd();
            }
            response.Close();

            return rt;
        }

        /// <summary>
        /// 以utf-8编码通过POST方式发送数据。
        /// </summary>
        /// <param name="Url">url</param>
        /// <param name="postString">Post数据</param>
        /// <returns></returns>
        public string PostString_UTF8(string Url, string postString)
        {
            return PostString(Url, postString, Encoding.UTF8);
        }

    }
}

  

时间: 2024-11-06 20:12:25

本地测试通过,服务器出现乱码的相关文章

微信现金红包接口本地测试成功,服务器上失败后的解决办法

本地测试成功后,基本上确定代码还是可用的. 那么本地跟服务器就剩下配置上的区别了. 现金红包接口api 是需要带证书的.所以呢,iis配置有所不同. asp.net 4.0 + iis 8.0  配置环境 1 打开iis   点击 应用程序池 2 点击最右侧的  右上角   设置应用程序池默认设置 3 设置 里面的参数,把 加载用户配置文件 项  改为  true 重启下 iis  再试试  服务器上的接口是否变得正常了呢.

搭建本地Ubuntu 镜像服务器

一.需求分析能不能在局域网搭建一个Ubuntu 镜像服务器,这样作的好处是可以节省Ubuntu某些常用工具的安装时间. 二.部署过程 2.1 测试环境目前在公司内有一台能连接到外网的Ubuntu机器, IP : 192.168.8.173 ,Ubuntu版本为Ubuntu 9.04 i686. 2.2 搭建步骤为了创建Ubuntu mirror 服务器,最少需要60G硬盘空间,Ubuntu每个版本都有32 bit和64 bit两个版本,有两组deb包.当然可以创建Ubuntu一个版本的32 bi

win7 windows server 2008R2下 https SSL证书安装的搭配(搭配https ssl本地测试环境)

原文:http://www.cnblogs.com/naniannayue/archive/2012/11/19/2776948.html 要想成功架设SSL安全站点关键要具备以下几个条件. 1.需要从可信的证书办法机构CA获取服务器证书. 2.必须在WEB服务器上安装服务器证书. 3.必须在WEB服务器上启用SSL功能. 4.客户端(浏览器端)必须同WEB服务器信任同一个证书认证机构,即需要安装CA证书. 下面,我们对照上面的四部,进行一步一步的操作 1:需要从可信的证书办法机构CA获取服务器

win10系统iis下部署https (ssl/tls)本地测试环境

有时想要把公司的某些XX项目部署成https站点,是为了在传输层加密传输,防止他人嗅探站点重要数据信息,平常我们使用的http方式都是明文方式传输的很不安全,容易被他人窃取.而有些时候要在本地搭建https环境用来测试,下面看具体在本地搭建https测试站点. 首先要去证书认证机构申请一个证书用来测试,认证机构很多,如              1.http://www.symantec.com/zh/cn/ 2.https://www.geotrust.com/  3.https://cn.g

在本地测试一次成功的AJAX请求

要在本地测试AJAX,首先是环境的搭建,下面以wamp为例. 1.先在wamp的官网下载wamp的安装包,网址 http://www.wampserver.com/. 2.安装wamp.如果安装过程中提示丢失VCRUNTIME140.DLL缺失,请看这篇文章:http://www.jb51.net/article/81595.htm. 3.安装完wamp后,双击桌面上wamp的快捷方式启动wamp. 如果wamp正常启动,任务栏右下角有绿色的w图标,如图: 接下来是代码的编写. 在wamp安装目

如何本地测试例如QQ登录等第三方接口

前言:现在基本是个网站就会集成第三方的一些接口,比如QQ登录.分享等等.但是在开发的时候,尤其是没有这方面经验的开发人员来说,调试流程时会显得迷茫,不知道怎么调试.这里就个人的这方面学习摸索做一个总结. 如题,本篇只是总结 如何本地测试例如QQ登录等第三方接口. 特别说明:1.本文以集成QQ登录接口为例.2.因为是NET程序猿,所以以VS举例说明 关于如何成为QQ开发者,如何申请AppID以及AppKey,不再赘述!百度百科上都有了,还说什么呢!呵呵~ 关于如何集成,这个官网上都有各种SDK,而

搭建可调试的微信公众平台本地测试环境

背景: 最近在筹建一个协同开发的开源项目NWechat,项目开始前,有几样事情要准备. 1)项目管理系统的选定: 2)源码版本控制系统的选定: 3)开发环境的搭建. 4)团队的建设. 开发环境搭建便是项目启动前,要做的几件事情之一. 一.问题是这样的 在微信开发的时候,必须要输入URL,而该URL必须是外网域名. 这就造成了一个问题,我们在开发环境下不能测试代码,更谈不上调试代码了. 二.大家是这么做的 我问过一些开发者正在使用的方案: 1)搭建测试服务器. 在开发环境编码后,提交到测试服务器测

如何在本地测试微信公众号

这里是介绍如何搭建微信二次开发测试环境,没什么技术含量.目的是提供一种思路,方便开发. 微信公众号开发要求采用80端口,实现能够在通过网络访问的web服务器.为了解决这种需求,网上大部分文章都是建议通过BAE或者SAE来建站.但是这样建站存在一些问题,最主要的是调试不方便.每次修改都需要重新上传架包,严重影响开发效率. 既然微信只要求一个URL和80端口,为什么同不通过建站指向本地的web服务器呢? 事实上有很多这样本地建站的工具,例如nat123和花生壳. 通过建站工具,本地建立创建一个web

友言评论框本地测试问题

友言评论框在本地测试的时候,如果你的域名是localhost/***,在友言后台是直接验证不通过的. 因为他的验证是通过域名验证,而localhost如果大家都用的话是没法分清楚谁是谁的,所以理论上友言之类的社会化评论框只支持线上使用. 但是问题来了,友言怎么能分清楚写的是本地还是线上的域名呢?答案是,它根本不用分清楚. 友言只是会进行唯一性验证,如果这个域名或者ip之前没有出现过,它就会给你验证通过,如果出现过,就会让你用其他方式,比如嵌入meta标签,修改html等方式验证. 所以说如果想本