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; } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |