加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 验证请求内容类型

发布时间:2020-12-15 05:40:05 所属栏目:百科 来源:网络整理
导读:我正在尝试在POST,PUT和PATCH请求中验证Content-Type的值,但是当我忘记content-type子句或使用内容类型时,当前代码才起作用:“Content-Type:富”. 当我发送“Content-Type:text / css”时,我得到了这个: 500 Internal Server ErrorNo MediaTypeFormatter
我正在尝试在POST,PUT和PATCH请求中验证Content-Type的值,但是当我忘记content-type子句或使用内容类型时,当前代码才起作用:“Content-Type:富”.
当我发送“Content-Type:text / css”时,我得到了这个:
500 Internal Server Error
No MediaTypeFormatter is available to read an object of type 'MyClassDto' from content with media type 'text/css'.

这是我的代码:

public class ContentTypeFilter : IActionFilter
{
    private readonly List<MediaTypeHeaderValue> _suport;

    /// <summary />
    public ContentTypeFilterAttribute()
    {
        _suport = new List<MediaTypeHeaderValue>();

        foreach (var formatter in GlobalConfiguration.Configuration.Formatters.ToArray())
        {
            _suport.AddRange(formatter.SupportedMediaTypes);
        }
    }

    public bool AllowMultiple { get { return false; } }

    public Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext,CancellationToken cancellationToken,Func<Task<HttpResponseMessage>> continuation)
    {
        var metodos = new List<string> { "POST","PUT","PATCH" };

        if (actionContext.Request.Content != null)
        {
            if (metodos.Contains(actionContext.Request.Method.Method.ToUpperInvariant()))
            {
                MediaTypeHeaderValue contentType = actionContext.Request.Content.Headers.ContentType;

                if (contentType == null || !_suport.Any(x => x.MediaType.Equals(contentType.MediaType)))
                {
                    return CreateResponse(actionContext.Request,"Invalid Content-Type");
                }
            }
        }

        return continuation();
    }

    private static Task<HttpResponseMessage> CreateResponse(HttpRequestMessage request,string mensagem)
    {
        var tsc = new TaskCompletionSource<HttpResponseMessage>();
        var response = request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
        response.ReasonPhrase = mensagem;
        response.Content = new StringContent(mensagem);
        tsc.SetResult(response);

        return tsc.Task;
    }

如果内容不是XML或JSON,是否有另一种方法来验证内容类型并返回错误415?

解决方法

我找到了一个很好的解决方案 here.

通过一些更改来获得我想要的东西:

public class ContentTypeFilter : DelegatingHandler
{
    private readonly List<MediaTypeHeaderValue> _suport;

    /// <summary />
    public ContentTypeFilter()
    {
        _suport = new List<MediaTypeHeaderValue>();

        foreach (var formatter in GlobalConfiguration.Configuration.Formatters.ToArray())
        {
            _suport.AddRange(formatter.SupportedMediaTypes);
        }
    }

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,CancellationToken cancellationToken)
    {
        var metodos = new List<string> { "POST","PATCH" };

        if (request.Content != null)
        {
            if (metodos.Contains(request.Method.Method.ToUpperInvariant()))
            {
                MediaTypeHeaderValue contentType = request.Content.Headers.ContentType;

                // Nas configura??es n?o possui o Charset aceito.
                if (contentType == null || !_suport.Any(x => x.MediaType.Equals(contentType.MediaType)))
                {
                    return Task<HttpResponseMessage>.Factory.StartNew(() => CreateResponse(request,"Suported content-types: " + string.Join(",",_suport.Select(x => x.ToString()))));
                }
            }
        }
        return base.SendAsync(request,cancellationToken);
    }

    private static HttpResponseMessage CreateResponse(HttpRequestMessage request,string mensagem)
    {
        var response = request.CreateResponse(HttpStatusCode.UnsupportedMediaType);
        response.ReasonPhrase = mensagem;
        response.Content = new StringContent(mensagem);

        return response;
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读