在MVC Web API中设置导致多个请求的ContentType

时间:2015-03-19 20:03:25

标签: asp.net-mvc rest http

我在Web API中有一个简单的GetFile方法,它返回在数据库中以二进制形式存储的文件。该文件可以是图像,视频或录音,因此我根据扩展名设置内容类型:

    [System.Web.Mvc.HttpGet]
    public HttpResponseMessage GetFile(Guid Id)
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);

        var file = db.Files.Where<NonConformityFile>(item => item.Id == Id).FirstOrDefault<NonConformityFile>();

        byte[] imgData = file.FileContents;
        MemoryStream ms = new MemoryStream(imgData);
        response.Content = new StreamContent(ms);

        if (file.FileExtension == "png")
            response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/png");
        else if (file.FileExtension == "mp4")
            response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("video/mp4");
        else if (file.FileExtension == "caf")
            response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("audio/x-caf");
        else
            throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, file.FileExtension + " is not a supported file format"));

        return response;
    }

这样可以正常工作,但是当向方法添加一些安全性时(通过在http标头中提供令牌),它开始崩溃。设置断点时,我发现断点实际上被击中了两次。第二次令牌从标题中消失,导致身份验证失败。

进一步的调试让我发现设置response.Content.Header.ContentType会导致第二次调用GetFile方法。

这是设计行为,还是我的开发环境中出现的一些疯狂的副作用?

要重现,请尝试:

        [System.Web.Mvc.HttpGet]
    public HttpResponseMessage GetFile()
    {
        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);

        response.Content = new StreamContent(new MemoryStream());
        response.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("image/png");

        return response;
    }

看看Method是否运行了两次。我无法在此行为中看到逻辑,这会导致我的身份验证出现问题。

0 个答案:

没有答案