我在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是否运行了两次。我无法在此行为中看到逻辑,这会导致我的身份验证出现问题。