让C#的WebService项目使用Jexus部署到Linux
起因
最近在百度统计有不少搜索 ".NetCore调用WebService",看来是想把老项目迁移到.Net Core或者.Net 5/6,其实除了客户端(WinForm,这一块主要是客户的机器还是万年的Windows XP,这一点在医疗行业尤其突出)还是有必要的.当然如果项目没有依赖Windows,也是可以项目部署到Linux(WebForm/MVC及WebService,WCF这个没测试,后面有时间会试用一下).1.创建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 });
}
}
}
2. 将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($"HelloWorld Result={str}");
string jsonResult = service1SoapClient.GetName("tom");
Console.WriteLine($"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
秋风
2022-02-09