.Net Core 3.1 Serilog在IIS10服务器失效,本地正常,跨版本调用问题排查
我们在.NET Core 3.1解决方案中实现了全局日志功能,通过以下代码从.NET Framework 4.7.2解决方案发送错误详情:
string URL = Convert.ToString(ConfigurationManager.AppSettings["netCoreSolutionURL"]) + "AppLogging/LogCSharpError"; using (var client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = client.PostAsync(URL, new StringContent(JsonConvert.SerializeObject(appLog).ToString(), Encoding.UTF8,"application/json")).Result; //var responseString = response.Content.ReadAsStringAsync().Result; }
本地环境下一切正常,错误详情可写入对应日志文件夹;但部署到IIS10服务器后,.NET Framework 4.7.2发送的错误无日志记录,事件查看器也无报错,且已给日志文件夹完全权限(日志解决方案自身触发的应用启动日志可正常记录)。请排查是否遗漏服务器配置、安全协议或其他相关设置?(我们使用Serilog记录错误及信息)
可能的问题点及解决办法
TLS版本兼容性问题
.NET Framework 4.7.2默认可能未启用TLS 1.2,而IIS10上的.NET Core应用可能仅支持TLS 1.2及以上版本。在HttpClient初始化前添加代码强制启用TLS 1.2:ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;HttpClient同步调用死锁
代码中使用.Result同步调用异步方法,在IIS环境下易导致死锁,请求无法发送。改为异步调用:using (var client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); var response = await client.PostAsync(URL, new StringContent(JsonConvert.SerializeObject(appLog).ToString(), Encoding.UTF8,"application/json")); // 取消注释查看响应内容,排查请求状态 var responseString = await response.Content.ReadAsStringAsync(); }同时确保调用该代码的方法标记为
async Task,避免使用async void。应用池权限与网络访问
- 检查.NET Framework应用的应用池身份(如
ApplicationPoolIdentity)是否具备访问目标.NET Core API的网络权限 - 验证服务器DNS解析或hosts文件配置,确保
netCoreSolutionURL能正确解析到目标服务器
- 检查.NET Framework应用的应用池身份(如
IIS请求限制与防火墙拦截
- 检查IIS10上的.NET Core应用是否配置了允许POST请求到
AppLogging/LogCSharpError路径的请求筛选规则 - 确认服务器防火墙(Windows防火墙或硬件防火墙)未拦截两台服务器之间的HTTP/HTTPS通信
- 检查IIS10上的.NET Core应用是否配置了允许POST请求到
Serilog配置差异
服务器上的Serilog配置可能与本地不同,存在过滤规则导致接收的日志被丢弃。检查.NET Core应用的Serilog配置,确保未排除API请求提交的日志条目。URL配置错误
验证服务器上netCoreSolutionURL配置的地址是否正确,包括协议(http/https)、端口(非默认时),避免因URL无效导致请求失败。可在代码中添加日志记录当前使用的URL,便于排查。
内容的提问来源于stack exchange,提问作者Rudresh Kundur

