ASP.NET Core项目中调用WebService的方法

一、前言

现实生产中,有一些比较老的系统对外提供的接口都是WebService形式的,如果是使用.NET Framework创建的项目调用WebService非常方便,网上有很多代码示例,这里不在讲解,下面我们讲解如何在ASP.NET Core项目里面调用WebService。首先我们需要创建一个WebService项目和一个ASP.NET Core WebApi项目。创建的WebService代码如下:

using System.Web.Services;

namespace CoreCallWebServiceTest
{
    /// <summary>
    /// CoreTest 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
    // [System.Web.Script.Services.ScriptService]
    public class CoreTest : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }

        /// <summary>
        ///
        /// </summary>
        /// <param name="para"></param>
        /// <returns></returns>
        [WebMethod]
        public string TestMethod(string para)
        {
            return $"输入参数:{para}";
        }
    }
}

里面分别有一个无参和有参的方法。我们在ASP.NET Core WebApi项目里面分别调用这两个方法并输出。

二、引用WebService

首先我们在创建好的ASP.NET Core WebApi项目里面添加WebService的引用。

1、在依赖项上面右键,选择“添加连接的服务”,如图所示:

2、选择“Microsoft WCF Web Service Referenct Provider”,如图所示:

3、添加服务引用。如图所示:

配置完以后,点击“下一步”,去掉重新使用引用的程序集中的类型签名的复选框。如果不去掉复选框,生成的时候可能会报错。

直接点击“完成”按钮即可。慢慢等待配置完成:

配置完成界面如图所示:

这样就添加完了,下面开始在代码里面调用提供的WebService里面的方法。

三、在代码中调用WebService

我们添加一个名为Test的控制器,里面有一个Get方法,返回WebService里面两个方法的返回值,代码如下:

using System.ServiceModel;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using TestWebService;

namespace AspNetCoreDemo.Controllers
{
    [Route("api/Test")]
    [ApiController]
    public class TestController : ControllerBase
    {
        [HttpGet]
        public string Get()
        {
            //创建 HTTP 绑定对象
            var binding = new BasicHttpBinding();
            //根据 WebService 的 URL 构建终端点对象,参数是提供的WebService地址
            var endpoint = new EndpointAddress(@"http://localhost:37907/CoreTest.asmx");
            //创建调用接口的工厂,注意这里泛型只能传入接口 泛型接口里面的参数是WebService里面定义的类名+Soap
            var factory = new ChannelFactory<CoreTestSoap>(binding, endpoint);
            //从工厂获取具体的调用实例
            var callClient = factory.CreateChannel();
            //调用具体的方法,这里是 HelloWorldAsync 方法
            Task<HelloWorldResponse> responseTask = callClient.HelloWorldAsync(new HelloWorldRequest());
            //获取结果
            HelloWorldResponse response = responseTask.Result;
            // 获取HelloWorld方法的返回值
            string result1 = response.Body.HelloWorldResult;

            // 调用TestMethod方法,不传递参数
            Task<TestMethodResponse> testResponse = callClient.TestMethodAsync(new TestMethodRequest());
            // 获取
            string result2 = testResponse.Result.Body.TestMethodResult;

            // 调用TestMethod方法,并传递参数
            TestMethodRequestBody body = new TestMethodRequestBody("测试TestMethod方法");
            Task<TestMethodResponse> testResponsePara = callClient.TestMethodAsync(new TestMethodRequest(body));
            // 获取
            string result3 = testResponse.Result.Body.TestMethodResult;

            return $"HelloWorld方法返回值:{result1},TestMethod方法不传递参数返回值:{result2},TestMethod方法传递参数的返回值:{result3}";
        }
    }
}

我们在WebService里面定义的TestMethod方法有一个string类型的参数,调用的时候有两个重载函数,一个无参,一个有参,看一下自动生成的Reference.cs类里面的代码:

发现TestMethodRequestBody有两个构造函数:一个无参,一个有参。我们在浏览器里面调用Get方法,程序输出结果:

除了上面的代码,也可以使用下面的代码进行调用:

using System.ServiceModel;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using TestWebService;

namespace AspNetCoreDemo.Controllers
{
    [Route("api/Test")]
    [ApiController]
    public class TestController : ControllerBase
    {
        [HttpGet]
        public string Get()
        {
            #region 调用方法1
            ////创建 HTTP 绑定对象
            //var binding = new BasicHttpBinding();
            ////根据 WebService 的 URL 构建终端点对象,参数是提供的WebService地址
            //var endpoint = new EndpointAddress(@"http://localhost:37907/CoreTest.asmx");
            ////创建调用接口的工厂,注意这里泛型只能传入接口 泛型接口里面的参数是WebService里面定义的类名+Soap
            //var factory = new ChannelFactory<CoreTestSoap>(binding, endpoint);
            ////从工厂获取具体的调用实例
            //var callClient = factory.CreateChannel();
            ////调用具体的方法,这里是 HelloWorldAsync 方法
            //Task<HelloWorldResponse> responseTask = callClient.HelloWorldAsync(new HelloWorldRequest());
            ////获取结果
            //HelloWorldResponse response = responseTask.Result;
            //// 获取HelloWorld方法的返回值
            //string result1 = response.Body.HelloWorldResult;

            //// 调用TestMethod方法,不传递参数
            //Task<TestMethodResponse> testResponse = callClient.TestMethodAsync(new TestMethodRequest());
            //// 获取
            //string result2 = testResponse.Result.Body.TestMethodResult;

            //// 调用TestMethod方法,并传递参数
            //TestMethodRequestBody body = new TestMethodRequestBody("测试TestMethod方法");
            //Task<TestMethodResponse> testResponsePara = callClient.TestMethodAsync(new TestMethodRequest(body));
            //// 获取
            //string result3 = testResponsePara.Result.Body.TestMethodResult;
            #endregion

            #region 调用方法2
            BasicHttpBinding binding = new BasicHttpBinding();

            EndpointAddress address = new EndpointAddress("http://localhost:37907/CoreTest.asmx");

            CoreTestSoapClient client = new CoreTestSoapClient(binding, address);

            Task<HelloWorldResponse> responseTask = client.HelloWorldAsync();
            HelloWorldResponse response = responseTask.Result;
            // 获取HelloWorld方法的返回值
            string result1 = response.Body.HelloWorldResult;

            // 调用TestMethod方法,这时必须传入参数
            Task<TestMethodResponse> testResponseTask = client.TestMethodAsync("测试TestMethod方法");
            // 获取TestMethod方法的返回值
            string result2 = testResponseTask.Result.Body.TestMethodResult;
            #endregion
            return $"HelloWorld方法返回值:{result1},TestMethod方法返回值:{result2}";
        }
    }
}

在这种方式中,调用有参的方法必须要传递参数。

程序运行结果:

如果以后WebService有更新,只需要更新添加的服务引用即可,如图所示:

到此这篇关于ASP.NET Core项目调用WebService的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C# .Net动态调用webService实现思路及代码

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net; using System.IO; using System.Web.Services.Description; using System.CodeDom; using Microsoft.CSharp; using System.CodeDom.Compiler; usi

  • ASP.NET调用WebService服务的方法详解

    本文实例讲述了ASP.NET调用WebService服务的方法.分享给大家供大家参考,具体如下: 一.WebService:WebService是以独立于平台的方式,通过标准的Web协议,可以由程序访问的应用程序逻辑单元. (1)应用程序逻辑单元:web服务包括一些应用程序逻辑单元或者代码.这些代码可以完成运算任务,可以完成数据库查询,可以完成计算机程序能够完成的任何工作. (2)可由程序访问:当前大多是web站点都是通过浏览器由人工访问的,web服务可以由计算机程序来访问. (3)标准的we协

  • 深入.net调用webservice的总结分析

    最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice .我们都知道,调用webserivice 最简单的方法就是在 "引用"  那里点击右键,然后选择"引用web服务",再输入服务地址.确定后,会生成一个app.config 里面就会自动生成了一些配置信息.现在正在做的这个项目就不能这么干.后来经过一番搜索,就找出另外几种动态调用webservice 的方法.废话少说,下面是webservice 代码 复制代码

  • Asp.NET Core 如何调用WebService的方法

    0.使用背景 因为现在的项目都是基于 .NET Core 的,但是某些需要调用第三方的 WebService 服务,故有了此文章.其基本思路是通过微软提供的 Svcutil 工具生成代理类,然后通过 System.ServiceModel 来调用代理类所提供的对象与方法. 1.配置准备 1.1 新建并编辑项目 首先新建一个新的 .NET Core 控制台程序,通过命令行窗口或者 Powershell 执行以下命令新建一个项目. dotnet new console 然后编辑项目文件 WebSer

  • ASP.NET如何定时调用WebService服务

    下面是一个实际案例: 某个项目有一个需求,需要定时去调用别家公司的一个Web 系统的 WebService,把他们系统中的数据导入到我们的系统中.由于是调用 Web 接口,这就无法使用数据库中的任务计划实现了.后来想到使用Time 组件,利用Global 中的Application. using System; using System.Collections; using System.Configuration; using System.Data; using System.Linq; u

  • ASP.NET Core项目中调用WebService的方法

    一.前言 现实生产中,有一些比较老的系统对外提供的接口都是WebService形式的,如果是使用.NET Framework创建的项目调用WebService非常方便,网上有很多代码示例,这里不在讲解,下面我们讲解如何在ASP.NET Core项目里面调用WebService.首先我们需要创建一个WebService项目和一个ASP.NET Core WebApi项目.创建的WebService代码如下: using System.Web.Services; namespace CoreCall

  • ASP.NET Core使用HttpClient调用WebService

    一.创建WebService 我们使用VS创建一个WebService,增加一个PostTest方法,方法代码如下 using System.Web.Services; namespace WebServiceDemo { /// <summary> /// WebTest 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(Conform

  • asp.net core项目中如何使用html文件

    前言 大家应该都知道,在asp.net core 项目中,使用html文件一般通过使用中间件来提供服务: 打开 NuGet程序管理控制台 输入install-package Microsoft.aspnetcore.staticfiles 进行添加 ASP.NET Core static files middleware. Includes middleware for serving static files, directory browsing, and default files. 在S

  • 使用Ajax更新ASP.Net MVC项目中的报表对象方法

    Ajax技术显著加快了Web应用程序的速度.另外,视觉效果方面也有提升.大家都同意,每次点击按钮时整个页面都会被刷新这一点不太友好.如果你的网速不是很快,那么这个过程会很烦人,因为所有的元素都会先消失,再慢慢重新出现.如果只刷新一部分页面,那就美滋滋了.而这正是Ajax所提供的.该脚本向服务器发送一个请求,以更新所需的部分信息.然后,脚本将更新的数据插入页面上的正确位置. 在这个页面中,我想用一个简单的方法通过Ajax更新ASP .Net MVC项目中的信息.这种方法被称为"unobtrusiv

  • 在Asp.net core项目中使用WebSocket

    今天小试了一下在Asp.net core中使用websocket,这里记录一下: 在 Startup 类的 Configure 方法中添加 WebSocket 中间件. app.UseWebSockets(); 它也可以传入一些参数 app.UseWebSockets(new WebSocketOptions() { KeepAliveInterval = TimeSpan.FromSeconds(120), ReceiveBufferSize = 4 * 1024 }); 添加WebSocke

  • 在IIS上部署ASP.NET Core项目的图文方法

    概述 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel)运行,IIS则是作为反向代理的角色转发请求到Kestrel不同端口的ASP.NET Core程序中,随后就将接收到的请求推送至中间件管道中去,处理完你的请求和相关业务逻辑之后再将HTTP响应数据重新回写到IIS中,最终转达到不同的客户端(浏览器,APP,客户端等).而配置文件和过程都会由些许调整,中间最重要的角色便是AspNetCoreModule,

  • ASP.NET Core SignalR中的流式传输深入讲解

    前言 什么是流式传输? 流式传输是这一种以稳定持续流的形式传输数据的技术. 流式传输的使用场景 有些场景中,服务器返回的数据量较大,等待时间较长,客户端不得不等待服务器返回所有数据后,再进行相应的操作.这时候使用流式传输,可以将服务器数据碎片化,当每个数据碎片读取完成之后,就只传输完成的部分,而不需要等待所有数据都读取完成. SignalR SignalR是一个.NET Core/.NET Framework的开源实时框架. SignalR的可使用Web Socket, Server Sent

  • ASP.NET Core 5中如何生成PDF文档

    前言 大家用 ASP.NET Core 进行项目开发时,常会有生成 PDF 的需求,那如何生成呢?这篇文章我们就来讨论如何通过 DinkToPdf 来生成 PDF 文档,DinkToPdf 封装了 C++ 的 wkhtmltopdf 工具包,前者通过 P/Invoke 的方式来调用后者,而底层的 wkhtmltopdf 利用 Qt WebKit 渲染引擎将 html 转成 pdf. 安装 DinkToPdf 要想安装 DinkToPdf,可以通过 Nuget 可视化界面或者通过 NuGet Pa

  • 三种方法解决ASP.NET Core 6中的依赖项

    依赖性注入是一种技术,它允许我们注入一个特定类的依赖对象,而不是直接创建这些实例. 使用依赖注入的好处显而易见,它通过放松模块间的耦合,来增强系统的可维护性和可测试性. 依赖注入允许我们修改具体实现,而不必改变依赖于它们的依赖类型. ASP.NET Core 很重视依赖注入技术.ASP.NET Core 中内置的依赖注入提供功能模块,并不像 StructureMap 和 Ninject 等IoC(控制反转)容器那样功能丰富,但它速度快,易于配置,而且易于使用.我们可以使用它在 ASP.NET C

  • .Net Core项目中NLog整合Exceptionless实例

    目录 前言 概念 Exceptionless NLog 环境搭建 Exceptionless搭建 集成NLog 简单测试一下 总结 前言 在实际的.Net Core相关项目开发中,很多人都会把NLog作为日志框架的首选,主要是源于它的强大和它的扩展性.同时很多时候我们需要集中式的采集日志,这时候仅仅使用NLog是不够的,NLog主要是负责代码中日志的落地,也就是收集程序中的日志.类似的使用ELK(Elasticsearch+Logstash+Kibana)或EFK(Elasticsearch+F

随机推荐