起因
最近在百度统计有不少搜索 ".NetCore调用WebService",看来是想把老项目迁移到.Net Core或者.Net 5/6,其实除了客户端(WinForm,这一块主要是客户的机器可能还是万年的Windows XP,这一点在医疗行业尤其突出)还是有必要的.当然如果老项目没有依赖Windows独有的功能,还是可以将项目部署到Linux(WebForm/MVC及WebService,WCF这个没测试,后面有时间会试用一下).
创建WebService项目
创建WebService项目是和正常一样的,唯一要调用的就是在Nuget管理器中移除 Microsoft.CodeDom.Providers.DotNetCompilerPlatform,如果是老项目,这则要排除是否依赖Windows的组件.
可以参考这篇博文: 如何将Asp.Net WebForm/MVC迁移到Linux
测试代码:
public class People
{
public string Name { get; set; }
public int Age { get; set; }
}
using System.Web.Services;
using Newtonsoft.Json;
using WebServiceApp.Models;
namespace WebServiceApp
{
/// <summary>
/// WebService1 的摘要说明
/// </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 WebService1 : WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
public string GetName(string name)
{
return JsonConvert.SerializeObject(new People() { Name = name, Age = 30 });
}
}
}
将WebService部署到Linux
将C#的WebService部署到Linux,这里使用的服务器软件是Jexus(jexus官网,正经的国产服务器软件,上手简单).可以简单将Jexus理解为Windows上的IIS.
Jexus集成了Mono,携带有.Net Framework的程序集,发布项目时,只需要保留项目所依赖的程序集(dll).
这里使用WSL Ubuntu 20.04安装jexus,因为自带有curl,直接通过curl下载jexus的shell然后进行安装.
//只需这一行
curl https://jexus.org/release/x64/install.sh|sh
Jexus安装路径在/usr/jexus ,默认配置文件在/usr/jexus/siteconf/default
// 启动jexus, 使用80和443端口要使用管理员权限
// sudo /usr/jexus/jws start 启动siteconf目录所有配置
sudo /usr/jexus/jws start
// 可以根据配置文件名指定启动
sudo /usr/jexus/jws start default
启动后,在浏览器中输入ip:端口号
// 这里使用wsl ip是172.29.129.199 使用的80端口 ,注意url区分大小
http://172.29.129.199/WebService1.asmx
在.Net 6同步调用WebService
在项目引用WebService有2种方式,
- 使用VS2022,在项目右键服务引用,有VS生成WebService引用文件.
- 使用dotnet-svcutil工具生成,这个需要安装
先说一下在VS怎么生成:
输入服务地址,填写要引用服务的命名空间
选择生成服务类型为WCF
选择默认配置:
需要生成同步调用:
测试调用服务代码:
ServiceApp.WebService1SoapClient service1SoapClient = new(ServiceApp.WebService1SoapClient.EndpointConfiguration.WebService1Soap);
string str = service1SoapClient.HelloWorld();
Console.WriteLine(#34;HelloWorld Result={str}");
string jsonResult = service1SoapClient.GetName("tom");
Console.WriteLine(#34;GetName Result={jsonResult}");
调用结果:
如果不想用VS生成WebService调用的代理类,就需要安装dotnet-svcutil工具.
//安装 dotnet-svcutil
dotnet tool install -g dotnet-svcutil
//通过dotnet-svcutil 生成服务代理对象 -n 命名空间 --sync 要生成同步调用
dotnet-svcutil http://172.29.129.199/WebService1.asmx?wsdl -n "*,ServiceApp" --sync
个人能力有限,如果您发现有什么不对,请私信我
如果您觉得对您有用的话,可以点个赞或者加个关注,欢迎大家一起进行技术交流