C#通过HttpWebRequest发送HttpPost请求调用WebService
在C#开发中,有时需要绕过标准代理类直接调用WebService,或使用非XML格式的POST数据。本文将演示如何使用HttpWebRequest和HttpWebResponse手动发起Post请求,将XML及业务数据作为表单参数发送给服务器,并获取返回的字符串结果。
1. 核心逻辑与准备条件
调用传统Web服务(如.asmx)时,若需传递自定义结构化的数据(如XML片段),通常需要将其编码为application/x-www-form-urlencoded格式的查询字符串。我们需要构建请求头、创建输入流写入数据,并最终从响应流中读取结果。
第1步:配置请求基础信息
首先确定WebService的完整URL地址,并指定要调用的具体方法路径。例如,将http://localhost/WebService/MyService.asmx扩展为.../MyAction。
第2步:构建Post数据体
将需要传输的参数拼接成标准的键值对字符串。在本示例中,两个关键参数为:strXml:包含结构化数据(如<a ObjID=\"9\"></a>)。strData:业务标识数据(如ContactSign|990011|我的数据)。
最终组合为:strXml=...&strData=...。
第3步:执行HttpWebRequest
实例化HttpWebRequest对象,设置以下关键属性以确保服务器正确解析:
- Method = "POST":
- ContentType = "application/x-www-form-urlencoded"。
- 计算字节数组长度并赋值给ContentLength。
2. 完整代码实现
以下是完整的C#实现代码,包含主调用入口与通用的网络请求封装方法。
void UpdateContactSign()
{
// 设置目标WebService地址及具体方法
string ServerPage = "http://localhost/WebService/MyService.asmx/MyAction";
try
{
// 定义第一个参数:XML格式数据
string strXml = "<a ObjID=\"9\"></a>";
// 定义第二个参数:业务数据
string strData = "ContactSign|990011|我的数据";
// 调用通用请求方法
string res = HttpConnectToServer(ServerPage, strXml, strData);
// 处理返回结果 res
}
catch (Exception ex)
{
// 记录异常日志
}
}
// 通用HTTP Post连接方法
public string HttpConnectToServer(string ServerPage, string strXml, string strData)
{
// 1. 拼接Post Body
string postData = "strXml=" + Uri.EscapeDataString(strXml) +
"&strData=" + Uri.EscapeDataString(strData);
// 2. 将字符串转换为字节数组
byte[] dataArray = Encoding.UTF8.GetBytes(postData);
// 3. 创建请求对象
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(ServerPage);
request.Method = "POST";
request.ContentLength = dataArray.Length;
request.ContentType = "application/x-www-form-urlencoded";
Stream dataStream = null;
try
{
// 4. 获取请求流并写入数据
dataStream = request.GetRequestStream();
dataStream.Write(dataArray, 0, dataArray.Length);
dataStream.Close();
}
catch (Exception)
{
return null; // 连接服务器失败或流打开失败
}
// 5. 获取响应并读取结果
string res = string.Empty;
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8))
{
res = reader.ReadToEnd();
}
}
catch (Exception ex)
{
return null; // 响应失败
}
return res;
}
3. 注意事项
- 编码一致性问题:原示例中使用
Encoding.Default可能导致中文乱码,建议统一使用Encoding.UTF8进行GetBytes和StreamReader读取,并在拼接参数时对特殊字符使用Uri.EscapeDataString进行URL编码。 - 资源释放:在实际生产环境中,建议使用
using语句块自动管理Stream和StreamReader的生命周期,避免内存泄漏。 - 安全提醒:直接拼接XML到URL参数中可能引发注入风险,务必确保数据来源可信或对输入内容进行严格校验。
以上就是C#发送HttpPost请求来调用WebService的详细内容,更多关于C#网络编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













