用.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

相关推荐
步步为营DotNet15 小时前
深度探索.NET 中 IAsyncEnumerable:异步迭代的底层奥秘与高效实践
java·jvm·.net
时光追逐者15 小时前
ASP.NET Core 依赖注入的三种服务生命周期
后端·c#·asp.net·.net·.netcore
一个帅气昵称啊1 天前
.Net如何优雅的实现发送邮件服务
.net·mail·邮件
时光追逐者1 天前
一个 WPF 开源、免费的 SVG 图像查看控件
开源·c#·.net·wpf
武藤一雄2 天前
C# 中线程安全都有哪些
后端·安全·微软·c#·.net·.netcore·线程
de之梦-御风2 天前
【WebAPI 模拟器】.NET 8/9 + Minimal API + Swagger + DI + WPF Host
.net·wpf·web
AI题库2 天前
NopCommerce 4.9.3开发实战 1.2 开发环境搭建指南(.NET 9+ & Visual Studio 2022)
ide·microsoft·.net·visual studio
我是唐青枫2 天前
C#.NET 索引器完全解析:语法、场景与最佳实践
c#·.net
追逐时光者2 天前
一款基于 .NET 9 构建的企业级 Web RBAC 快速开发框架
.net
幌才_loong2 天前
深入解析 C# async/await 执行原理:从语法糖到状态机
后端·.net