部署至IIS服务器的WebService调用返回404 Not Found求助
问题排查:ASP.NET Core API部署IIS后返回404 Not Found
我开发了一个带API的WebService,本地Visual Studio运行完全正常,但部署到另一台IIS服务器后,调用始终返回“not found”。本地调用URL http://localhost:20857/vla/AppLogin 正常,用IIS服务器URL http://SRV-GTT-IIS02:8089/vla/AppLogin 调用直接返回404。该IIS服务器上其他WebService运行正常,对比配置未发现异常。
API路由代码
using gttWebServicePlatform.Models; using gttWebServicePlatform.Repositories; using Microsoft.AspNetCore.Mvc; namespace gttWebServicePlatform.Controllers { [Route("vla/AppLogin")] [ApiController] public class AppLoginController : ControllerBase { private readonly RepositoryAppLogin _repositoryAppLogin = new(); [HttpPost] public IActionResult AppLogin(ModelAppLoginRequest appLoginRequest) { try { return base.Ok(_repositoryAppLogin.GetAppLogin(appLoginRequest)); } catch (System.Exception) { return base.BadRequest("Nope not working..."); } } } }
测试客户端调用代码
private async void AppLogin() { ModelAppLoginRequest appLoginRequest = new ModelAppLoginRequest() { TruckPlate = gttDXTextEdit3.Text, Password = gttDXTextEdit2.Text, DateEvent = DateTime.Now, GPSLocation = gttDXTextEdit1.Text }; string JsonData = JsonConvert.SerializeObject(appLoginRequest); System.Net.Http.StringContent restContent = new StringContent(JsonData, Encoding.UTF8, "application/json"); HttpClient client = new HttpClient(); try { var response = await client.PostAsync(comboBoxEdit2.Text, restContent); if (response.IsSuccessStatusCode) { var stream = await response.Content.ReadAsStringAsync(); ModelAppLoginResponse Result = JsonConvert.DeserializeObject<ModelAppLoginResponse>(stream); textBox2.Text = Result.Authorized.ToString() + " " + Result.TruckID.ToString(); //Result.SCS_ID + " " + Result.PaymentID; } else { textBox2.Text = response.StatusCode + " " + response.ReasonPhrase; } } catch (Exception ex) { textBox2.Text = ex.Message; } }
IIS日志记录
2022-10-28 16:42:04 #Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken 2022-10-28 16:42:04 192.168.137.185 POST /vla/AppLogin - 8089 - 192.168.137.144 - - 404 0 2 1359 2022-10-28 16:52:45 127.0.0.1 GET / - 8089 - 127.0.0.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64;+rv:106.0)+Gecko/20100101+Firefox/106.0 - 403 14 0 41 2022-10-28 16:52:45 127.0.0.1 GET /favicon.ico - 8089 - 127.0.0.1 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64;+rv:106.0)+Gecko/20100101+Firefox/106.0 http://localhost:8089/ 404 0 64 41 #Software: Microsoft Internet Information Services 10.0 #Version: 1.0 #Date: 2022-10-28 16:57:17 #Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken 2022-10-28 16:57:17 192.168.137.185 POST /vla/AppLogin - 8089 - 192.168.137.144 - - 404 0 2 219
补充测试结果
- 停止IIS站点后调用会超时,确认请求能到达站点;
- 启用目录浏览后可从本地访问服务器站点目录,确认站点可达;
- 在服务器上直接运行WebService的exe,本地调用正常,仅通过IIS部署时远程调用返回404。
排查方向
- 检查ASP.NET Core Hosting Bundle安装情况:确认IIS服务器已安装与项目.NET版本匹配的ASP.NET Core Hosting Bundle,未安装的话请求无法被正确转发到Kestrel进程。
- 验证应用程序池配置:
- 确认应用程序池的.NET CLR版本设置为
无托管代码(ASP.NET Core为自托管模式,不需要IIS托管); - 检查应用程序池身份是否拥有站点目录的读写权限,尤其是日志、临时文件目录。
- 确认应用程序池的.NET CLR版本设置为
- 核对站点物理路径与路由:
- 确认IIS站点的物理路径指向WebService的正确发布目录(需包含web.config、bin文件夹等文件);
- 若站点设置了虚拟目录,调用URL需包含虚拟目录名称,避免路由冲突。
- 查看应用启动日志:
- 在
appsettings.json中设置日志级别为Debug,或开启web.config中的stdoutLogEnabled,查看是否有启动失败、路由加载异常的日志信息; - 检查事件查看器中
Windows Logs -> Application下的ASP.NET Core相关事件。
- 在
- 检查web.config配置:确认web.config中aspNetCore模块的
processPath和arguments指向正确的程序集,示例配置:<aspNetCore processPath="dotnet" arguments=".\gttWebServicePlatform.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> - 验证请求合法性:用Postman等工具直接发起请求,确认请求头、请求体格式正确,排除客户端URL拼接错误(比如comboBoxEdit2.Text是否包含多余空格或字符)。
- 排查IIS规则限制:确认站点未配置影响API路由的重写规则,或URL授权规则未阻止POST请求。
内容的提问来源于stack exchange,提问作者GuidoG
相关产品推荐
相关产品推荐

