ASP.NET Core 2.0中添加asmx服务及JavaScript访问404问题求助
我完全懂你现在的挫败感——想把旧的asmx服务搬到ASP.NET Core 2.0里,结果要么建不了新的,导入后又访问不了,浏览器还一直返回404,确实摸不着头脑。咱们先把核心原因说清楚:ASP.NET Core从根本上不支持传统的asmx Web服务,因为asmx依赖的System.Web组件在Core的架构里被彻底移除了,Core的请求管道根本不知道该怎么处理.asmx结尾的请求,这就是404的根源。
下面给你两个可行的解决方案,你可以根据自己的需求选择:
方案一:迁移到ASP.NET Core Web API(强烈推荐)
这是最符合Core生态的长期解决方案,毕竟asmx已经是被淘汰的技术了,Web API更适合现代Web开发。步骤很简单:
- 新建一个Web API控制器:在Core项目里右键添加「控制器」,选择「API控制器 - 空」,比如命名为
MyOldServiceController。 - 迁移asmx的方法逻辑:把原来asmx里标记
[WebMethod]的方法,复制到控制器里,改成API的Action。比如原来的:
改成:[WebMethod] public string GetUserInfo(int userId) { // 原来的业务逻辑 return JsonConvert.SerializeObject(user); }[HttpGet("GetUserInfo")] public IActionResult GetUserInfo(int userId) { // 复用原来的业务逻辑 return Ok(user); // Core会自动序列化JSON } - 配置路由和Mvc:确保在
Startup.cs的ConfigureServices里添加了services.AddMvc();,Configure方法里有app.UseMvc();。控制器上可以加[Route("api/[controller]")],这样前端调用的地址就是/api/MyOldService/GetUserInfo?userId=123。 - 前端调整调用:把原来JavaScript里调用
.asmx的代码改成调用这个API地址。如果需要跨域,记得在Startup.cs里配置CORS:services.AddCors(options => { options.AddPolicy("AllowAll", policy => { policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); }); }); // 然后在Configure里添加 app.UseCors("AllowAll");
方案二:保留asmx服务(应急临时方案)
如果因为各种原因暂时不能迁移,也可以用这个办法绕开Core的限制:
子方案1:单独部署asmx服务
把原来的asmx服务放在一个独立的.NET Framework Web项目里(比如ASP.NET Web Forms或者MVC 5),部署到服务器上。然后前端直接调用这个独立项目的asmx地址,比如http://your-old-service.com/MyService.asmx/GetUserInfo。如果两个项目域名不同,记得在asmx项目里配置CORS(可以通过web.config或者代码添加),或者在Core项目里做反向代理,把asmx的请求转发到旧服务。
子方案2:用WCF替代asmx
ASP.NET Core 2.0支持WCF的部分服务端功能,你可以把asmx的逻辑迁移到WCF服务里:
- 在Core项目里安装
Microsoft.AspNetCore.Wcf相关NuGet包。 - 定义服务契约和实现,把原来asmx的方法转换成WCF的操作契约。
- 配置WCF服务的终结点,前端可以通过SOAP协议调用(需要用
XmlHttpRequest或者SOAP客户端库)。不过这个方式不如Web API灵活,前端调用也更麻烦,只推荐实在没办法的时候用。
最后再提醒一句:别浪费时间尝试让Core直接处理asmx请求了,因为Core没有对应的请求处理程序,怎么配置都会404。迁移到Web API才是一劳永逸的办法。
内容的提问来源于stack exchange,提问作者AbdiasM

