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

相关推荐
唐青枫1 天前
C#.NET Monitor 与 Mutex 深入解析:进程内同步、跨进程互斥与使用边界
c#·.net
会写代码的建筑师1 天前
.NET 控制台后台程序实践细节总结
后端·.net
阿捞21 天前
在 .NET 中使用 Moonshot Kimi + AgentFramework:从 SDK 到 Agent 的完整实践
html·.net·xhtml
步步为营DotNet1 天前
解锁.NET 11 中 Microsoft.Extensions.AI 在智能后端开发的深度应用
人工智能·microsoft·.net
无风听海1 天前
.NET10之C# 中的is null深入理解
服务器·c#·.net
bjzhang751 天前
FastReport——一个面向.NET生态的开源报表引擎
.net·fastreport
武藤一雄2 天前
C# 异常(Exception)处理避坑指南
windows·microsoft·c#·.net·.netcore·鲁棒性
步步为营DotNet2 天前
剖析.NET 11 中 Native AOT 在高性能客户端应用的极致实践
.net
步步为营DotNet2 天前
深度探索.NET Aspire在云原生应用性能与安全加固的创新实践
安全·云原生·.net
我是唐青枫2 天前
C#.NET TPL Dataflow 深入解析:数据流管道、背压控制与实战取舍
c#·.net