C# 实现动态访问 WebService,兼容 .NET Framework 和 .NET Core

开发 前端
通过结合HttpClient和XML解析技术,我们可以在.NET Core中动态访问WebService。这种方法不仅兼容.NET Core,而且也可以在.NET Framework中使用,从而实现了跨平台的兼容性。

在软件开发中,WebService 是一种常用的服务提供方式,它允许不同的系统之间进行数据交换。然而,在.NET Core中动态访问WebService并不像.NET Framework中那样直接,因为.NET Core移除了对WebClient类的某些功能以及WebService和WebReference的支持。但这并不意味着在.NET Core中无法动态访问WebService,相反,我们可以通过一些技巧和库来实现这一目标,同时保持与.NET Framework的兼容性。

本文将介绍如何在C#中快速实现动态访问WebService,并且这种方法既适用于.NET Framework,也适用于.NET Core。

一、背景介绍

在.NET Framework中,我们通常通过添加WebService引用或使用WebClient类来访问WebService。但在.NET Core中,这些方法不再适用。因此,我们需要寻找一种新的方法来实现动态访问。

二、解决方案

在.NET Core中,我们可以使用HttpClient类来发送HTTP请求,并结合HttpClientFactory来管理HttpClient的实例。为了解析WebService返回的XML数据,我们可以使用System.Xml命名空间中的类。

以下是一个简单的例子,演示了如何使用HttpClient来动态访问一个SOAP-based WebService,并解析返回的XML数据。

三、示例代码

假设我们有一个简单的WebService,它接受一个整数参数,并返回一个字符串。WebService的WSDL地址是http://example.com/MyService?wsdl。

1. 创建HttpClient实例

首先,我们需要在Startup.cs中配置HttpClient:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient();
    // 其他服务配置...
}

然后,在控制器或服务中注入IHttpClientFactory来创建HttpClient实例:

public class MyService
{
    private readonly IHttpClientFactory _httpClientFactory;

    public MyService(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    public async Task<string> CallWebServiceAsync(int inputValue)
    {
        var client = _httpClientFactory.CreateClient();
        // 设置WebService的URL和SOAPAction(如果有的话)
        var soapRequest = CreateSoapRequest(inputValue);
        var content = new StringContent(soapRequest, Encoding.UTF8, "text/xml");
        var response = await client.PostAsync("http://example.com/MyService", content);
        var soapResponse = await response.Content.ReadAsStringAsync();
        return ParseSoapResponse(soapResponse);
    }

    // 创建SOAP请求的方法...
    // 解析SOAP响应的方法...
}

2. 创建SOAP请求

我们需要根据WebService的WSDL来构建SOAP请求。以下是一个简单的例子:

private string CreateSoapRequest(int inputValue)
{
    return @"<?xml version=""1.0"" encoding=""utf-8""?>
            <soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"">
                <soap:Body>
                    <MyMethod xmlns=""http://example.com/"">
                        <inputValue>" + inputValue + @"</inputValue>
                    </MyMethod>
                </soap:Body>
            </soap:Envelope>";
}

请确保将MyMethod和命名空间http://example.com/替换为实际的WebService方法和命名空间。

3. 解析SOAP响应

解析SOAP响应通常涉及到XML的解析。以下是一个简单的例子,使用XmlDocument来解析响应:

private string ParseSoapResponse(string soapResponse)
{
    var doc = new XmlDocument();
    doc.LoadXml(soapResponse);
    var namespaceManager = new XmlNamespaceManager(doc.NameTable);
    namespaceManager.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
    var responseNode = doc.SelectSingleNode("//soap:Body/MyResponse/MyResult", namespaceManager);
    return responseNode?.InnerText;
}

同样,请确保将MyResponse和MyResult替换为实际的响应元素名称。

四、总结与展望

通过结合HttpClient和XML解析技术,我们可以在.NET Core中动态访问WebService。这种方法不仅兼容.NET Core,而且也可以在.NET Framework中使用,从而实现了跨平台的兼容性。随着.NET的发展,我们期待更多简洁和高效的库来简化WebService的访问过程。

责任编辑:武晓燕 来源: 程序员编程日记
相关推荐

2009-08-26 14:27:03

C# Framewor

2009-08-26 15:10:34

脱离.net fram

2009-08-26 15:25:06

.NET Framew

2009-08-26 14:16:17

C# FrameWor

2009-08-20 16:07:39

C#和ADO.NET访

2009-08-03 14:33:02

.NET平台c#ASP.NET

2009-08-26 14:23:14

C#.Net Fram

2009-11-03 14:13:23

VB.NET C#

2009-08-20 10:13:49

ASP.NET和C#的

2021-09-13 07:00:01

C# .NET 缓存

2009-08-11 14:26:56

C#动态调用WebSe

2009-08-06 16:36:20

研究C#和.Net

2009-08-26 10:09:22

C#编码规范

2009-09-01 16:29:03

QuickSort C

2009-08-18 16:57:24

VB.NET和C#

2009-08-20 18:44:54

C#和ADO.NET

2009-09-07 15:04:07

2009-08-19 15:44:09

ObjectARX .

2021-08-17 10:03:34

.NET开发者使用量

2010-01-06 18:33:56

.Net Framew
点赞
收藏

51CTO技术栈公众号