让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的组件.
在Nuget管理器中移除Microsoft.CodeDom.Providers.DotNetCompilerPlatform

测试代码:
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默认配置文件,指向WebService发布后的目录

# 启动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

使用jexus运行c# WebService服务

在.Net 6同步调用WebService

在项目引用WebService有2种方式,
  1. 使用VS2022,在项目右键服务引用,有VS生成WebService引用文件.
  2. 使用dotnet-svcutil工具生成,这个需要安装

先说一下在VS怎么生成:
输入服务地址,填写要引用服务的命名空间
输入服务地址,填写要引用服务的命名空间
选择生成服务类型为WCF
选择生成服务类型为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}");

调用结果:

在.Net 6调用WebService结果

如果不想用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