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

.NET 7 ASP.NET Core Web API IIS Express调用后503错误排查

问题分析与解决方案

核心问题点

从你的描述和代码来看,IIS Express下的503错误主要由以下几个原因叠加导致:

  1. DbContext手动实例化引发资源泄漏:直接new AdminDbContext()未利用依赖注入管理生命周期,异步调用时数据库连接无法正确释放,IIS Express资源限制更严格,很快会耗尽连接池触发503。
  2. JsonSchema重复解析的资源消耗:每次请求都调用JsonSchema.Parse,该过程占用大量内存和CPU,在IIS线程池环境下易触发进程回收或资源耗尽。
  3. 缓存操作非原子性:并发请求时多线程会重复查询数据库、重复解析Schema,加剧资源竞争。
  4. 共享消息列表导致线程污染:全局复用messages列表,不同验证请求的错误信息互相覆盖,可能引发未预期异常导致进程崩溃。

具体修复步骤

1. 改用依赖注入管理DbContext

不要手动创建AdminDbContext,通过构造函数注入:

// 服务类构造函数注入AdminDbContext
private readonly AdminDbContext _adminDbContext;

public YourServiceClass(AdminDbContext adminDbContext)
{
    _adminDbContext = adminDbContext;
}

2. 原子化缓存解析后的JsonSchema

把解析好的JsonSchema直接存入缓存,避免重复解析,同时用GetOrCreateAsync保证并发安全:

// 替换原有缓存逻辑
var jsonSchema = await memoryCache.GetOrCreateAsync(schemaType, async entry =>
{
    entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15);
    entry.SlidingExpiration = TimeSpan.FromMinutes(15);
    entry.Size = 1024;

    var jSchemaDm = await _adminDbContext.JsonSchemaDms.FirstOrDefaultAsync(c => c.SchemaType == schemaType);
    if (jSchemaDm == null)
    {
        throw new InvalidOperationException($"未找到类型为{schemaType}的JSON Schema");
    }
    return JsonSchema.Parse(jSchemaDm.Schema);
});

3. 避免共享消息列表

每次验证单个JSON时创建独立的消息列表,防止交叉污染:

foreach (var line in jsonFiles)
{
    if (line.Length > 0)
    {
        msgCount++;
        // 每次循环创建新的消息列表
        var currentMessages = new List<string>();
        try
        {
            var ojson = JObject.Parse(line);
            bool valid = ojson.IsValid(jsonSchema, out currentMessages);
            validatedJsons.Add(new ValidatedJson 
            { 
                IsValid = valid, 
                JsonMessage = line, 
                Messages = currentMessages, 
                JsonMessageNumber = msgCount 
            });
        }
        catch (Exception ex) 
        {
            currentMessages.Add(ex.Message.Trim());
            validatedJsons.Add(new ValidatedJson 
            { 
                IsValid = false, 
                JsonMessage = line, 
                Messages = currentMessages, 
                JsonMessageNumber = msgCount 
            });
        }
    }
}

4. 排查IIS Express通用问题

针对另一个Web App的503错误,可检查:

  • 查看IIS Express日志(路径一般为%USERPROFILE%\Documents\IISExpress\Logs),获取具体错误原因。
  • 调整应用池回收设置:右键项目→属性→调试,修改"启用编辑并继续"等选项,或手动增加进程内存限制。
  • 通过netstat -ano命令检查端口是否被其他进程占用。

修改后的完整代码示例

public class YourServiceClass
{
    private readonly AdminDbContext _adminDbContext;

    public YourServiceClass(AdminDbContext adminDbContext)
    {
        _adminDbContext = adminDbContext;
    }

    public async Task<List<ValidatedJson>> ValidateJson(string[] jsonFiles, string schemaType, IMemoryCache memoryCache)
    {
        var validatedJsons = new List<ValidatedJson>();

        try
        {
            // 原子化获取或创建缓存的JsonSchema
            var jsonSchema = await memoryCache.GetOrCreateAsync(schemaType, async entry =>
            {
                entry.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(15);
                entry.SlidingExpiration = TimeSpan.FromMinutes(15);
                entry.Size = 1024;

                var jSchemaDm = await _adminDbContext.JsonSchemaDms.FirstOrDefaultAsync(c => c.SchemaType == schemaType);
                if (jSchemaDm == null)
                {
                    throw new InvalidOperationException($"未找到类型为{schemaType}的JSON Schema");
                }
                return JsonSchema.Parse(jSchemaDm.Schema);
            });

            int msgCount = 0;
            foreach (var line in jsonFiles)
            {
                if (line.Length > 0)
                {
                    msgCount++;
                    var currentMessages = new List<string>();
                    try
                    {
                        var ojson = JObject.Parse(line);
                        bool valid = ojson.IsValid(jsonSchema, out currentMessages);
                        validatedJsons.Add(new ValidatedJson 
                        { 
                            IsValid = valid, 
                            JsonMessage = line, 
                            Messages = currentMessages, 
                            JsonMessageNumber = msgCount 
                        });
                    }
                    catch (Exception ex) 
                    {
                        currentMessages.Add(ex.Message.Trim());
                        validatedJsons.Add(new ValidatedJson 
                        { 
                            IsValid = false, 
                            JsonMessage = line, 
                            Messages = currentMessages, 
                            JsonMessageNumber = msgCount 
                        });
                    }
                }
            }
        }
        catch (Exception ex)
        {
            validatedJsons.Add(new ValidatedJson 
            { 
                IsValid = false, 
                Messages = new List<string> { ex.Message.Trim() }, 
                ServiceError = ex.Message 
            });
        }

        return validatedJsons;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 12:47:28