.net core 通过不同Accept访问同方法请求不同方法处理
电脑版发表于:2019/10/30 16:04
                    1.对于自定义的Accept需要进行注册
比如我这里的 application/vnd.cgzl.hateoas+json
services.AddMvc(option =>
{
    option.ReturnHttpNotAcceptable = true;
    //option.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
    #region 注册请求的media type商业类型
    var outputFormatter = option.OutputFormatters.OfType<JsonOutputFormatter>().FirstOrDefault();
    if (outputFormatter != null)
    {
        outputFormatter.SupportedMediaTypes.Add("application/vnd.cgzl.hateoas+json");
    }
    #endregion
}).AddJsonOptions(options=> {
    //输出小写
    options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
});2.写验证特性
RequestHeaderMatchingMediaTypeAttribute.cs
[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = true)]
public class RequestHeaderMatchingMediaTypeAttribute : Attribute, IActionConstraint
{
    private readonly string _requestHeaderToMatch;
    private readonly string[] _mediaTypes;
    /// <summary>
    /// 
    /// </summary>
    /// <param name="requestHeaderToMatch"> 请求头部的类型 </param>
    /// <param name="mediaTypes"> mediaTypes类型 </param>
    public RequestHeaderMatchingMediaTypeAttribute(string requestHeaderToMatch, string[] mediaTypes)
    {
        _requestHeaderToMatch = requestHeaderToMatch;
        _mediaTypes = mediaTypes;
    }
    /// <summary>
    /// 如果请求的Header包含该枚举类型就算通过
    /// </summary>
    /// <param name="context"></param>
    /// <returns></returns>
    public bool Accept(ActionConstraintContext context)
    {
        var requestHeaders = context.RouteContext.HttpContext.Request.Headers;
        if (!requestHeaders.ContainsKey(_requestHeaderToMatch))
        {
            return false;
        }
        foreach (var mediaType in _mediaTypes)
        {
            var mediaTypeMatches = string.Equals(requestHeaders[_requestHeaderToMatch].ToString(),
                mediaType, StringComparison.OrdinalIgnoreCase);
            if (mediaTypeMatches)
            {
                return true;
            }
        }
        return false;
    }
    public int Order { get; } = 0;
}Result:


 
        
