用.Net的HttpClient调用WebServices的接口

HttpClient调用WebServices的接口

**前提:**有一些老的WebServices(历史遗留)提供了Http的调用,可以直接HttpClient调用,另一些则只可以用SOAP调用,对于可以用http调用的直接使用httpclient发送请求。

1.启动一个WebServices项目

这里提供一个现成的Demo

NetWebServices: 基于.NetFramework 4.8 学习 WebServices,支持SOAP1.1/SOAP1.2/HTTP请求

可以用Postman等调用试一试

2.另起一个项目用HttpClient调用

webServices的返回都是XML,如果要使用一般需要解析其内容,可以使用

System.Xml.XmlSerializer来解析,以第一个返回字符串的webservices接口为例:

csharp 复制代码
[HttpGet]
public StandResult<List<WebServiceUser>> HttpGet_WebServices()
{
    HttpClient httpClient = new HttpClient();
    
    httpClient.BaseAddress = new Uri("https://localhost:44371/WebService1.asmx/GetAllUsers");

    Task<HttpResponseMessage> task = httpClient.GetAsync(httpClient.BaseAddress);

    HttpResponseMessage response = task.Result;
	
    //这个字符串就是XML文件的内容
    string result = response.Content.ReadAsStringAsync().Result;

    //拿到HttpRespone然后解析

    StringReader stringReader = new StringReader(result);

    //把Xml反序列化解析成实体
    XmlSerializer xmlSerializer = new XmlSerializer(typeof(WebServiceDO));

    var xmlstring = xmlSerializer.Deserialize(stringReader) as WebServiceDO;
	
    //里面嵌套的JSON可以再解析返回或者另做处理
    List<WebServiceUser> webServiceUsers = JsonConvert.DeserializeObject<List<WebServiceUser>>(xmlstring.JsonContext);

    if(webServiceUsers != null)
        return new StandResult<List<WebServiceUser>>() { _value = 0, _data = webServiceUsers };
    else
        return new StandResult<List<WebServiceUser>>() { _value = 0 };


}
csharp 复制代码
[XmlRoot("string",Namespace = "http://tempuri.org/")]
public class WebServiceDO
{
    [XmlText]
    public string JsonContext { get; set; }

   
}

public class WebServiceUser
{
    public int UserID { get; set; }

    public string UserName { get; set; }

    public string UserEmail {  get; set; }

    public int UserAge {  get; set; }
}

🍎 Tips:

HttpClient的Get参数设置:(在请求后面加就可以)

csharp 复制代码
using System;
using System.Net.Http;
using System.Threading.Tasks;

public class GetRequestExample
{
    public async Task GetWithQueryStringAsync()
    {
        using (HttpClient client = new HttpClient())
        {
            // 方法A:手动构建URL
            string name = "张三";
            int age = 25;
            string url = $"http://api.example.com/users?name={Uri.EscapeDataString(name)}&age={age}";
            
            // 方法B:使用字典构建(更规范)
            var parameters = new Dictionary<string, string>
            {
                ["name"] = "张三",
                ["age"] = "25",
                ["page"] = "1",
                ["pageSize"] = "20",
                ["search"] = "关键字 测试"
            };
            
            string queryString = BuildQueryString(parameters);
            string url2 = $"http://api.example.com/users{queryString}";
            
            // 发送GET请求
            HttpResponseMessage response = await client.GetAsync(url2);
            
            if (response.IsSuccessStatusCode)
            {
                string result = await response.Content.ReadAsStringAsync();
                Console.WriteLine(result);
            }
        }
    }
    
    // 构建查询字符串的辅助方法
    private string BuildQueryString(Dictionary<string, string> parameters)
    {
        if (parameters == null || parameters.Count == 0)
            return string.Empty;
        
        var queryItems = parameters
            .Where(p => !string.IsNullOrEmpty(p.Value))
            .Select(p => $"{Uri.EscapeDataString(p.Key)}={Uri.EscapeDataString(p.Value)}");
        
        return "?" + string.Join("&", queryItems);
    }
    
    // 更简单的构建方法(使用FormUrlEncodedContent)
    private string BuildQueryStringSimple(Dictionary<string, string> parameters)
    {
        using (var content = new FormUrlEncodedContent(parameters))
        {
            return "?" + content.ReadAsStringAsync().Result;
        }
    }
}

HttpClient的Post参数设置:

csharp 复制代码
using System.Text;
using System.Text.Json;

public class PostRequestExample
{
    // 定义数据模型
    public class User
    {
        public string Name { get; set; }
        public string Email { get; set; }
        public int Age { get; set; }
        public List<string> Hobbies { get; set; }
    }
    
    public async Task PostJsonAsync()
    {
        using (HttpClient client = new HttpClient())
        {
            // 准备要发送的数据
            var user = new User
            {
                Name = "张三",
                Email = "zhangsan@example.com",
                Age = 25,
                Hobbies = new List<string> { "篮球", "音乐", "编程" }
            };
            
            // 方法A:手动序列化JSON
            string json = JsonSerializer.Serialize(user);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            
            // 方法B:使用扩展方法(需要安装 Microsoft.AspNet.WebApi.Client 包)
            // var content = new StringContent(
            //     JsonConvert.SerializeObject(user), 
            //     Encoding.UTF8, 
            //     "application/json"
            // );
            
            // 发送POST请求
            string url = "http://api.example.com/users";
            HttpResponseMessage response = await client.PostAsync(url, content);
            
            if (response.IsSuccessStatusCode)
            {
                string responseJson = await response.Content.ReadAsStringAsync();
                Console.WriteLine($"创建成功: {responseJson}");
                
                // 反序列化响应
                var createdUser = JsonSerializer.Deserialize<User>(responseJson);
            }
        }
    }
    
    // 传递简单键值对对象
    public async Task PostSimpleJsonAsync()
    {
        using (HttpClient client = new HttpClient())
        {
            var data = new 
            {
                username = "zhangsan",
                password = "123456",
                rememberMe = true
            };
            
            string json = JsonSerializer.Serialize(data);
            var content = new StringContent(json, Encoding.UTF8, "application/json");
            
            HttpResponseMessage response = await client.PostAsync(
                "http://api.example.com/login", 
                content
            );
        }
    }
}

System.Xml.XmlSerializer解析规则参考:

System.Xml.Serialization.XmlSerializer 类 - .NET | Microsoft Learn

C#进阶版-序列化与反序列化 - 知乎

XmlSerializer读写xml

相关推荐
喵叔哟2 天前
66.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--新增功能--自动记账
微服务·架构·.net
故事不长丨3 天前
C#log4net详解:从入门到精通,配置、实战与框架对比
c#·.net·wpf·log4net·日志·winform·日志系统
bjzhang753 天前
OneAuthCenter——一款基于 .NET打造的企业级 OAuth 2.0 / OpenID Connect 认证中心
.net·认证中心
步步为营DotNet3 天前
深度解析.NET 中Nullable<T>:灵活处理可能为空值的类型
java·前端·.net
csdn_aspnet3 天前
.NET 10 中的 ASP.NET Core:Blazor、API 和 OpenAPI 的重大更新
后端·asp.net·.net·.net10
weixin_421994784 天前
认识数据 - 变量与数据类型
c#·.net·.netcore
mudtools4 天前
深入理解飞书 Webhook 签名验证:一次踩坑到填坑的完整记录
网络·c#·.net·飞书
工业甲酰苯胺4 天前
如何一步步将 ASP.NET MVC 升级为.NET
asp.net·mvc·.net
闻缺陷则喜何志丹4 天前
【.NetAPI]统计标注的值、上公差、下公差
数学·.net·cad·netapi
一念一花一世界4 天前
Arbess项目实战 - 基于GitLab搭建.net项目自动化流水线
ci/cd·gitlab·.net·arbess