You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

部署至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。

排查方向

  1. 检查ASP.NET Core Hosting Bundle安装情况:确认IIS服务器已安装与项目.NET版本匹配的ASP.NET Core Hosting Bundle,未安装的话请求无法被正确转发到Kestrel进程。
  2. 验证应用程序池配置:
    • 确认应用程序池的.NET CLR版本设置为无托管代码(ASP.NET Core为自托管模式,不需要IIS托管);
    • 检查应用程序池身份是否拥有站点目录的读写权限,尤其是日志、临时文件目录。
  3. 核对站点物理路径与路由:
    • 确认IIS站点的物理路径指向WebService的正确发布目录(需包含web.config、bin文件夹等文件);
    • 若站点设置了虚拟目录,调用URL需包含虚拟目录名称,避免路由冲突。
  4. 查看应用启动日志:
    • 在appsettings.json中设置日志级别为Debug,或开启web.config中的stdoutLogEnabled,查看是否有启动失败、路由加载异常的日志信息;
    • 检查事件查看器中Windows Logs -> Application下的ASP.NET Core相关事件。
  5. 检查web.config配置:确认web.config中aspNetCore模块的processPath和arguments指向正确的程序集,示例配置:
    <aspNetCore processPath="dotnet" arguments=".\gttWebServicePlatform.dll" stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
    
  6. 验证请求合法性:用Postman等工具直接发起请求,确认请求头、请求体格式正确,排除客户端URL拼接错误(比如comboBoxEdit2.Text是否包含多余空格或字符)。
  7. 排查IIS规则限制:确认站点未配置影响API路由的重写规则,或URL授权规则未阻止POST请求。

内容的提问来源于stack exchange,提问作者GuidoG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:20:52