Ошибка превышения максимальной длины запроса, но размеры файлов не превышены

#jquery #asp.net #ajax #vb.net

#jquery #asp.net #ajax #vb.net

Вопрос:

У меня есть два элемента ввода файла на одной странице. Оба позволяют загружать несколько файлов. Я использую jquery ajax и веб-сервис asmx для загрузки файлов изображений. По какой-то причине файлы загружаются без каких-либо ошибок при использовании первых элементов ввода файла, но выдает ошибку превышения максимальной длины при использовании второго элемента ввода. Я использую файлы тестовых изображений, размер которых не превышает 4 МБ. Это код javascript для первого элемента ввода.

    function addCrs(){
    var nme = $("#crsName").val();
    var stp = "carousel";
    var upd = $("#crsAction option:selected").val();
    var fileUpload = $("#FileUpload1").get(0);
    var files = fileUpload.files;
    var test = new FormData();
    for (var i = 0; i < files.length; i  ) {
        var fsize = files[i].size;
        var ftype = files[i].type;
        var fname = files[i].name;

        var fl = files.length;
        if (fl == 0 || fsize > 3774873.6 || ftype != 'image/jpeg') {
            $("label[for$=FileUpload1]").css("color", "Red");
        } else {
            $("label[for$=FileUpload1]").css("color", "#000000");
            test.append(files[i].name, files[i]);
        };
    }

    test.append("stype", stp);

    test.append("rname", nme);

    test.append("upd", upd);

        $.ajax({
            url: "pgCde.asmx/SaveFiles",
            type: "POST",
            enctype: 'multipart/form-data',
            contentType: false,
            processData: false,
            cache: false,
            dataType: "xml",
            data: test,
            success: function (result) {
                $xml = $(result),
      $str = $xml.find("string");
                var str = $str.text();


                if (str !== "This Carousel name already exists please type another name.") {
                    var n = str.split("_");

                    var crsl = Object();

                    crsl.crslName = $("#crsNameLst option:selected").val();
                    crsl.crslWidth = n[0];
                    crsl.crslHeight = n[1];
                    crsl.crslNumPhoto = n[2];
                    crsl.crslPage = $("#pgNameCrs option:selected").val();


                    var crsObj = { 'crsl': crsl };

                    $.ajax({
                        url: "pgCde.asmx/addCarousel",
                        type: "POST",
                        dataType: "json",
                        data: JSON.stringify(crsObj),
                        contentType: "application/json; charset=utf-8",
                        success: function (data) {
                            $("#crsConfirm").html(data.d);
                        },
                        error: function (e) {
                            $("#crsConfirm").html("Unavailable");
                        }


                    });
                } else {
                    $("#crsConfirm").html(str);
                }
            },
            error: function (err) {
                $("#crsConfirm").html(err.statusText);
            }
        });
}
  

Это код в веб-службе:

 Public Function uploadImage(ByVal fCnt As Integer, ByVal cnt As Integer, ByVal reNme As String) As String
    Dim rsp As String = ""
    If Context.Request.Files.Count > 0 Then
        Dim files As HttpFileCollection = Context.Request.Files

        Dim cntStr As String = ""

        cntStr = cnt.ToString
        For i As Integer = 0 To files.Count - 1

            cnt = cnt   1

            If cnt <= 9 Then
                cntStr = "0" amp; cnt.ToString
            ElseIf cnt >= 10 Then
                cntStr = cnt.ToString
            End If
            Dim file As HttpPostedFile = files(i)
            Dim fname As String
            If HttpContext.Current.Request.Browser.Browser.ToUpper() = "IE" OrElse HttpContext.Current.Request.Browser.Browser.ToUpper() = "INTERNETEXPLORER" Then
                Dim testfiles As String() = file.FileName.Split(New Char() {""c})
                fname = testfiles(testfiles.Length - 1)
            Else
                fname = file.FileName
            End If


            Dim extF = file.ContentType
            Dim flLngth = file.ContentLength
            Dim fNme = fname.Split(".")
            Dim flExt = fNme(fNme.Length - 1)
            If flLngth <= 3774873.6 AndAlso extF = "image/jpeg" Then
                Dim nwPath = Path.Combine(Context.Server.MapPath("../Content/images/"), reNme amp; "_" amp; cntStr amp; "." amp; flExt)


                file.SaveAs(nwPath)
                Dim bmp As New Bitmap(nwPath)
                Dim wdth As String = bmp.Width.ToString()
                Dim hgt As String = bmp.Height.ToString()
                rsp = wdth amp; "_" amp; hgt amp; "_" amp; fCnt.ToString

                bmp.Dispose()

            Else
                rsp amp;= "Only jpeg files less than 3.6MB allowed."

            End If


        Next
    End If

    Return rsp
End Function
<WebMethod()>
Public Function SaveFiles() As String
    Dim rsp As String = ""
    Dim fCnt As Integer = Context.Request.Files.Count
    Dim reNme As String = Regex.Replace(Context.Request.Form("rname"), "W", "_")
    Dim updt As String = Context.Request.Form("upd")
    Dim stp As String = Context.Request.Form("stype")
    Dim cnt As Integer = 0

    Dim thlm As New thalMem2DataContext
    If updt = "Add" Then
        If stp = "slideshow" Then

            Dim sEx = (From s In thlm.Slideshow_Infos Where s.sldName = reNme Select s).Count()
            If sEx = 0 Then
                rsp amp;= uploadImage(fCnt, cnt, reNme)
            Else
                rsp amp;= "This SlideShow name already exists please type another name."
            End If
        ElseIf stp = "carousel" Then

            Dim cEx = (From c In thlm.Carousel_Infos Where c.Carousel_Name = reNme Select c).Count()
            If cEx = 0 Then
                rsp amp;= uploadImage(fCnt, cnt, reNme)
            Else
                rsp amp;= "This Carousel name already exists please type another name."
            End If
        End If
    ElseIf updt = "Update" Then
        Dim numP As Integer

        If stp = "slideshow" Then
            numP = (From n In thlm.Slideshow_Infos Where n.sldName = reNme Select n.numSlides).Single

        ElseIf stp = "carousel" Then
            numP = (From n In thlm.Carousel_Infos Where n.Carousel_Name = reNme Select n.Num_Photos).Single
        End If

        Dim fAdd As Integer = fCnt   numP
            rsp amp;= uploadImage(fAdd, numP, reNme)
        End If

        Return rsp
End Function
  

Этот код используется для обоих элементов ввода файла.

Это код javascript для второго элемента ввода файла:

 function addSld() {
    var nme = $("#sldName").val();
    var stp = "slideshow";
    var upd = $("#sldAction option:selected").val();
    var fileUpload = $("#FileUpload2").get(0);
    var files = fileUpload.files;
    var test = new FormData();

    for (var i = 0; i < files.length; i  ) {
        var fsize = files[i].size;
        var ftype = files[i].type;
        var fname = files[i].name;

        var fl = files.length;
        if (fl == 0 || fsize > 3774873.6 || ftype != 'image/jpeg') {
            $("label[for$=FileUpload2]").css("color", "Red");
        } else {
            $("label[for$=FileUpload2]").css("color", "#000000");
            test.append(files[i].name, files[i]);
        }
    }

    test.append("stype", stp);

    test.append("rname", nme);

    test.append("upd", upd);

 $.ajax({
            url: "pgCde.asmx/SaveFiles",
            type: "POST",
            enctype: 'multipart/form-data',
            contentType: false,
            processData: false,
            cache: false,
            dataType: "xml",
            data: test,
            success: function (result) {
                $xml = $(result),
      $str = $xml.find("string");
                var str = $str.text();


                if (str !== "This SlideShow name already exists please type another name.") {
                    var n = str.split("_");

                    var slide = Object();


                    slide.sldName = $.trim($("#sldName").val());
                    slide.sldOrient = $("#sldOrient option:selected").val();
                    slide.sldWidth = n[0];
                    slide.sldHeight = n[1];
                    slide.sldNumPhoto = n[2];
                    slide.sldPage = $("#pgNameSld option:selected").val();


                    var sldObj = { 'slide': slide };

                    $.ajax({
                        url: "pgCde.asmx/addSlideShw",
                        type: "POST",
                        dataType: "json",
                        data: JSON.stringify(sldObj),
                        contentType: "application/json; charset=utf-8",
                        success: function (data) {
                            $("#sldConfirm").html(data.d);
                        },
                        error: function (e) {
                            $("#sldConfirm").html("Unavailable");
                        }


                    });
                } else {
                    $("#sldConfirm").html(str);
                }
            },
            error: function (err) {
                $("#sldConfirm").html(err.statusText);
            }
        });
}
  

Это ошибка:

System.Web.HttpException: Превышена максимальная длина запроса.

в System.Web.HttpRequest.GetEntireRawContent()

в System.Web.HttpRequest.GetMultipartContent()

в System.Web.HttpRequest.FillInFilesCollection()

в System.Web.HttpRequest.EnsureFiles()

в System.Web.HttpRequest.get_Files()

в pgCde.SaveFiles() в C:UserssuzherDocumentsMy Веб-сайтыmySite App_Code pgCde .vb: строка 684

Строка 684 указывает на эту строку кода в веб-службе:

  Dim fCnt As Integer = Context.Request.Files.Count
  

Ответ №1:

Я, наконец, получил второй файл ввода для работы с комбинацией решений, которые я нашел здесь, в Stack Overflow. Первым решением было зайти в диспетчер IIS и остановить и перезапустить пул приложений по умолчанию для ASP.Net (в моем случае .NET CLR версии 4.0). Затем это позволило мне загружать несколько файлов одновременно, но выдавало ошибку максимальной длины запроса с более чем 4 или 5 файлами. Затем я изменил файл web.config и увеличил свойство maxRequestLength до 24 МБ следующим образом: (Это должно быть в системе.веб-раздел корневого файла web.config.)

 <system.web>
<httpRuntime targetFramework="4.5.2" maxRequestLength="24576" executionTimeout="3600"/>
</system.web>
  

Я действительно не могу сказать вам, почему это сработало, но это решение, которое решило эту проблему.