目前公司产品由 .NET Framework 升级到 .NET Core 过程中,因一部分对内或对外界接口使用的是 Web Service。
为了保证这些接口在升级后正常提供服务,开始考虑过使用 SoapCore 对这些接口进行实现。
但是尝试之后发现 SoapHeader 问题不好解决,所以暂时放弃将 Web Service 迁移到 .NET Core,而是将 Web Service 进行独立部署。
最终开发时决定使用的方案有以下两种:
- “类库” 的目标框架调整为可供
.NET Framework使用的 SDK,例如netstandard2.0(使用 TargetFrameworks 指定多个依赖项也可),方便托管 Web Service 的ASP.NET Web网站使用; .NET Core中提供Web API接口,Web Service的项目内不涉及具体业务,将请求转发到.NET Core的项目中处理。
考虑到如果采用方案一,每次发布要发布两套程序,即
.NET Core与ASP.NET Web,并且使用Web Service转发消息产生的延迟可以接受,所以最终采用方案二来进行实现。
接下来的内容最好了解一下 *.csproj 项目文件,可以参考:理解 C# 项目 csproj 文件格式的本质和编译流程
创建项目并编辑项目文件
首先我们需要创建一个 .NET Standard 的类库项目:

创建以后需要编辑我们的 csproj 项目文件,内容如下:
1 | <Project Sdk="Microsoft.NET.Sdk"> |
配置文件中我们做了这些事情:
- TargetFramework:指定目标框架为
.NET Framework 4.5.2; - OutputPath:指定了生成文件的目录;
- AppendTargetFrameworkToOutputPath:指定不附加目标框架到生成目录,不指定目录会是
bin\net452\*; - Reference:添加了
Web Service所依赖的程序集;
关于 TargetFramework 可以参考文档:.NET Standard
增加 Web Service 文件
Test.asmx 文件内容:
1 | <%@ WebService Language="C#" CodeBehind="Test.asmx.cs" Class="WebServiceTest.Test" %> |
Test.asmx.cs 文件内容:
1 | using System.Net; |
以上 Web Service 添加了一个简单的 Get 方法,当请求该方法并传入了正确的 token,服务将转发请求到 Web API,并将结果返回。
可以直接从其他项目拷贝,因为没有模板,从项目中添加会稍麻烦一些。
添加 Web.config 文件
了解 ASP.NET MVC 的大佬们对这个配置文件应该都很熟悉:
1 |
|
稍稍调整了网站的默认文档为我们刚刚添加的 Web Service 服务,避免请求根目录出现 400 错误。
增加用于调试的配置文件
项目中增加 Properties 文件夹,并创建 launchSetting.json 文件,内容如下:
1 | { |
该部分内容指定了 IIS Express 进行调试,因为我的解决方案中,Web 项目放在 src 文件夹下,所以命令行参数路径中加了 src,实际可能要根据自己的项目进行调整。
IIS Express 的命令行参数可以参考文档:Running IIS Express from the Command Line
不是必须添加这个文件,发布到 IIS,通过附加到
w3wp进程的方式进行调试也是可以的。
至此,托管了一个 Web Service 服务的网站项目就完成了:

测试
如果一切准备就绪后,无法正常运行调试,可能需要重启一下 VS。
正常开启调试以后,会弹出命令行:

这时我们在浏览器中可以通过 http://localhost:10880/Test.asmx 正常访问。

而通过 Soap UI 测试,Web Service 也可以正常的运行。

至此,这篇文章正文就结束了,虽然没有解决 Web Service 的迁移问题,但是也给大家提供了一个解决思路,希望对大家能有所帮助。
源码已经提交到 github:https://github.com/hd2y/WebServiceCore
而接下来会出一篇使用将 ASP.NET MVC 的项目迁移到 Microsoft.NET.Sdk 的避坑说明。
虽然有些老项目不能快速迁移到 ASP.NET Core MVC,但是使用 .NET Core SDK 风格管理项目还是很香的。