首页 > 解决方案 > 尝试通过 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

谢谢你的帮助!

标签: .netajaxapifileupload

解决方案


我们已经解决了这个问题,但可能只有临时修复。我们正在调用 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

我们的新代码有效,因为在这些初始步骤之后我们仍然有一个病毒扫描程序运行。


推荐阅读