尘叶心繁

.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:

关于TNBLOG
TNBLOG,技术分享
ICP备案 :渝ICP备18016597号-1
App store Android
精彩评论
{{item.replyName}}
{{item.content}}
{{item.time}}
{{subpj.replyName}}
@{{subpj.beReplyName}}{{subpj.content}}
{{subpj.time}}
猜你喜欢