.net - 尝试通过 AJAX 上传文件到 .NET 控制器时出现 HTTP400 错误请求
问题描述
我在尝试上传任何不是 .txt 文件的文件时收到此错误。文本文件工作正常。我假设这个问题在一年前没有发生,因为这段代码经历了多个测试阶段,很容易发现除了 .txt 之外的所有文件都无法上传。服务器代码是 VB.net:
阿贾克斯:
var uFile = new FormData();
var files = $(careerInformationSession.dg).find("#CareerSessionModel_Document_UploadFile").get(0).files;
if (files.length > 0) {
uFile.append("UploadedImage", files[0]);
var ajaxRequest = $.ajax({
type: "POST",
url: careerInformationSession.api + "UploadFile",
contentType: false,
processData: false,
data: uFile,
success: function (data) {
careerInformationSession.uploadSuccess(data);
},
error: function (ts) {
careerInformationSession.callFailure();
}
});
服务器:
<System.Web.Http.HttpPost>
Public Function UploadFile() As String
Dim returnValue As String = String.Empty
If HttpContext.Current.Request.Files.AllKeys.Any() Then
' Get the uploaded image from the Files collection
Dim httpPostedFile As System.Web.HttpPostedFile = HttpContext.Current.Request.Files("UploadedImage")
If httpPostedFile IsNot Nothing Then
Dim validateFile As New ValidateAjaxPostedFile(5120, "JPG,PNG,PDF,JPEG,GIF", httpPostedFile)
If validateFile.Validate() Then
SessionManager.SetSessionData(CWDS.Framework.Utilities.SessionManager.SubSystem.EM, CAREER_INFO_SESSION_FILE, validateFile.FileData)
SessionManager.SetSessionData(CWDS.Framework.Utilities.SessionManager.SubSystem.EM, CAREER_INFO_SESSION_FILE_NAME, System.IO.Path.GetFileName(httpPostedFile.FileName))
Else
Return returnValue
End If
End If
End If
Return returnValue
End Function
谢谢你的帮助!
解决方案
我们已经解决了这个问题,但可能只有临时修复。我们正在调用 InvokeIsValidRequestString 以防止脚本被插入到 api 调用中。此 .net 函数出于未知原因将任何非文本文件标记为恶意文件。
原始代码:
Return (New CustomRequestValidation).InvokeIsValidRequestString(HttpContext.Current, (New System.IO.StreamReader(HttpContext.Current.Request.InputStream)).ReadToEnd().Replace(",", ","), RequestValidationSource.Form, Nothing , -1)
新代码:
如果 HttpContext.Current.Request.Files.Count > 0 则返回 True 否则返回 (New CustomRequestValidation).InvokeIsValidRequestString(HttpContext.Current, (New System.IO.StreamReader(HttpContext.Current.Request.InputStream)).ReadToEnd()。 Replace(",", ","), RequestValidationSource.Form, Nothing, -1) End If
我们的新代码有效,因为在这些初始步骤之后我们仍然有一个病毒扫描程序运行。
推荐阅读
- python - 将我的数据分组并组合它们
- mysql - 为什么对我的简单 mysql 查询使用这个索引键会增加查询时间这么多?
- eclipse - 有没有办法让eclipse自动删除我已经修复的警告?
- sql - Adding two array collection in SQL
- sql-server - How to set SSRS subscription time as an expression
- typescript - TypeScript 错误 - 重复的函数声明/无法重新声明块范围的变量
- apache-spark - Spark SQL 不等于不处理使用滞后创建的列
- firefox-addon - 在 Firefox WebExtension 中播放远程音频文件时出现 CSP 错误
- delphi - Delphi Runtime Error 217 when application is started (Assertion failure (C:\...\tmssoftware\TMS VCL UI Pack\AdvXPVS.pas, line 1536)
- selenium - What is the difference between Selenium Server and Selenium RC?