C#发送HttpPost请求调用WebService
一、Webservice调用的三种方式:
Webservice调用1:浏览器中输入以下URL,然后再返回的页面输入参数,提交实现调用
http://localhost/WebService/MyService.asmx?op=MyAction
Webservice调用2:html中通过表单提交来实现调用
<form id="form1" runat="server" action="http://10.15.223.56/WebService/MyService.asmx/MyAction"> <input type="text" name="strXml" value="<a ObjID=\"9\"></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 ObjID=\"9\"></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 ........ ........ }