为何使用StringValues.Contains()检查Accept头始终返回false?
问题描述
我尝试通过以下代码检查HttpRequest的Accept请求头是否包含指定MIME类型:
public static bool AcceptsView(this HttpRequest request) => request.Headers.Accept.Contains("text/html");
但即使Accept头为Accept: text/html, text/plain, application/json时,该方法仍返回false,请问问题出在哪里?
问题原因与解决方案
问题根源
request.Headers.Accept返回的是StringValues类型,它的Contains方法是判断集合中是否存在完全匹配的项,而非检查字符串中是否包含子串。当Accept头包含多个用逗号分隔的MIME类型时,StringValues会将整个头内容作为单个元素存储,此时调用Contains("text/html")会因为找不到完全匹配的元素而返回false。
解决方案
方案1:基础子串检查(适用于简单场景)
先将StringValues转为字符串,再检查子串是否存在:
public static bool AcceptsView(this HttpRequest request) { var acceptHeader = request.Headers.Accept.ToString(); return acceptHeader.Contains("text/html"); }
方案2:规范解析(支持带权重的MIME类型)
使用MediaTypeHeaderValue解析Accept头,能正确处理带权重标记(如text/html;q=0.9)的情况,更严谨:
using Microsoft.Net.Http.Headers; public static bool AcceptsView(this HttpRequest request) { if (!request.Headers.TryGetValue(HeaderNames.Accept, out var acceptValues)) return false; foreach (var acceptValue in acceptValues) { if (MediaTypeHeaderValue.TryParse(acceptValue, out var mediaType)) { if (mediaType.MediaType.Equals("text/html", StringComparison.OrdinalIgnoreCase)) return true; } } return false; }
内容的提问来源于stack exchange,提问作者iKingNinja
相关产品推荐
相关产品推荐

