上传时Web API不支持媒体类型 - 未传递charset

时间:2014-07-28 15:02:05

标签: c# asp.net-web-api http-headers content-type

我正在开发一个新的Web API,并且目前正在集成(重写)旧版API以使用新的API。但是我遇到了Excel模板的问题。每次我尝试POST时,都会得到415不支持的媒体类型错误。

我已经设法让它工作所以我知道我的代码很好问题是当我使用模板时它将标题中的内容类型设置为:

Content-Type: application/xml;

但是,如果我将模板更改为发送:

Content-Type: application/xml; charset=utf-8

它可以像我期望的那样工作。问题是我无法更改生产中的模板。我必须使我的代码与模板一起使用。

1 个答案:

答案 0 :(得分:1)

这里的问题似乎是在;的情况下结束Content-Type: application/xml; ... Web API依靠System.Net.Http库来获取请求标头,并且此库为null提供了null在这种情况下,HttpRequestMessage's Content.Headers.ContentType和Web API看到Content-Length大于0但没有Content-Type标头,因此返回415 Unsupported Media Type

遵循我已经尝试过并且有效的解决方法(我正在使用Owin中间件,因为这将是我可以在System.Net.Http库进行解析之前修改原始请求标头的阶段。 ..)

public class FixContentTypeHeader : OwinMiddleware
{
    public FixContentTypeHeader(OwinMiddleware next) : base(next) { }

    public override async Task Invoke(IOwinContext context)
    {
        // Check here as requests can or cannot have Content-Type header
        if(!string.IsNullOrWhiteSpace(context.Request.ContentType))
        {
            MediaTypeHeaderValue contentType;

            if(!MediaTypeHeaderValue.TryParse(context.Request.ContentType, out contentType))
            {
                context.Request.ContentType = context.Request.ContentType.TrimEnd(';');
            }
        }

        await Next.Invoke(context);
    }
}

public void Configuration(IAppBuilder appBuilder)
{
    appBuilder.Use<FixContentTypeHeader>();