ASP.NET MVC Action方法返回文件时GET请求被拦截如何解决
问题原因
这个报错是因为ASP.NET MVC默认禁止GET请求返回JsonResult,防止敏感信息通过URL泄露。你遇到这个报错说明你的接口逻辑中存在返回JsonResult的分支(比如API调用失败时返回错误信息的Json),没有显式配置允许GET请求访问。同时你当前用GET请求传递token也存在安全风险,token会保存在浏览器历史、服务器日志等位置容易泄露。
修复方案
方案1:保留GET请求,修改Json返回配置
如果需要保留GET请求的实现,只要在所有返回JsonResult的位置添加JsonRequestBehavior.AllowGet参数即可,同时修正你代码中的语法错误:
[HttpGet] public ActionResult GetFile(string fileId, string token) { try { // call API with token and file Id // get bytes from string reponse // 修正语法错误:bytes[] 改为 byte[],添加分号 byte[] fileDownload = Convert.FromBase64String(apiResult.filecontent); return File(fileDownload, "application/pdf", "test_download.pdf"); } catch(Exception ex) { // 示例:如果有返回Json的错误分支,添加AllowGet参数 return Json(new { success = false, msg = ex.Message }, JsonRequestBehavior.AllowGet); } }
方案2:改为POST请求(更安全,更推荐)
这种方式既可以规避GET请求的Json安全限制,也能避免token等敏感信息放在URL中泄露,修改方式如下:
- 前端jQuery代码修改为动态创建表单提交POST请求:
// jQuery ajax to get fileId and token const form = $('<form method="POST" action="/APIFileDownload/GetFile"></form>'); form.append(`<input type="hidden" name="fileId" value="${response.fileId}">`); form.append(`<input type="hidden" name="token" value="${response.token}">`); $('body').append(form); form.submit(); form.remove();
- 后端Action修改为接收POST请求:
[HttpPost] public ActionResult GetFile(string fileId, string token) { // call API with token and file Id // get bytes from string reponse byte[] fileDownload = Convert.FromBase64String(apiResult.filecontent); return File(fileDownload, "application/pdf", "test_download.pdf"); }
内容的提问来源于stack exchange,提问作者Amin Sayed
相关产品推荐
相关产品推荐

