C#发送HttpPost请求调用WebService

一、Webservice调用的三种方式:

Webservice调用1:浏览器中输入以下URL,然后再返回的页面输入参数,提交实现调用

http://localhost/WebService/MyService.asmx?op=MyAction

Webservice调用2:html中通过表单提交来实现调用

<form  runat="server" action="http://10.15.223.56/WebService/MyService.asmx/MyAction">
  <input type="text" name="strXml" value="<a Obj9\"></a>" /> 
<input type="text" name="strData" value="ContactSign|990011|我的数据" />
<input type="submit" value="Send" />
</form>

Webservice调用3:在C#中发送HttpPost请求来调用WebService中的MyAction方法,代码如下:

        void UpdateContactSign()
        {
           string ServerPage ="http://localhost/WebService/MyService.asmx";
            try
            {
                //ServerPage += "?op=TangramAction";
                ServerPage += "/MyAction";//MyAction是WebService中的方法
              string strXml="<a Obj9\"></a>",;//第一个参数
              string strData="ContactSign|990011|我的数据";//第二个参数
               string res = HttpConnectToServer(ServerPage, strXml, strData);
                //MessageBox.Show(res);
            }
            catch (Exception ex)
            {
                
            }
        }

        //发送消息到服务器
        public string HttpConnectToServer(string ServerPage,string strXml,string strData)
        {
            string postData = "strXml=" + strXml+"&strData="+strData;

            byte[] dataArray = Encoding.Default.GetBytes(postData);
            //创建请求
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(ServerPage);
            request.Method = "POST";
            request.ContentLength = dataArray.Length;
            request.ContentType = "application/x-www-form-urlencoded";
            //创建输入流
            Stream dataStream = null;
            try
            {
                dataStream = request.GetRequestStream();
            }
            catch (Exception)
            {
                return null;//连接服务器失败
            }

            //发送请求
            dataStream.Write(dataArray, 0, dataArray.Length);
            dataStream.Close();
            //读取返回消息
            string res = string.Empty;
            try
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
                res = reader.ReadToEnd();
                reader.Close();
            }
            catch (Exception ex)
            {
                return null;//连接服务器失败
            }
            return res;
        }  

二、C#中发送HttpPost请求参数传值的中文乱码处理:

1.客户端参数Base64编码处理 在给postData赋值之前,先对 strData进行Base64编码处理,注意加号(’+‘)的替换处理,否则由于加号经过Url传递后变成空格而得不到合法的Base64字符串,修改代码如下:

     //发送消息到服务器
        public string HttpConnectToServer(string ServerPage,string strXml,string strData)
        {
            //Base64编码 处理中文乱码
            byte[] buffer = Encoding.Default.GetBytes(strData);
            string Base64StrData = Convert.ToBase64String(buffer).Replace("+", "%2B");//处理加号

            string postData = "strXml=" + strXml+"&strData="+Base64StrData;

            byte[] dataArray = Encoding.Default.GetBytes(postData);

            //创建请求
.......
.......        return res;
}

2.服务端获取到数据后,先解码再使用。解码的代码如下:

        public string MyAction(string strXml, string strData)
        {
            //Base64解码
            byte[] buffer = Convert.FromBase64String(strData);
            string Data = Encoding.Default.GetString(buffer);
           
           //方法实现部分代码中凡用到strData的地方 改为使用解码后的Data 
            ........
            ........
    
      }