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

为何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:43:16