C#通过HttpWebRequest发送HttpPost请求调用WebService

一颗松果
一颗松果
发布时间:2026-10-14| 5人浏览过
原创

在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#网络编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。