C# - серверная сторона WebMethod возвращает большой байт [] как ноль клиенту

У меня есть серверный ASP.NET WebMethod (System.Web.Services.WebMethod). Он вызывается из клиента через JavaScript. Он использует System.Net.WebClient для загрузки отчета SSRS через URL-адрес, преобразует отчет в байтовый массив и передает его обратно клиенту. Это прекрасно работает для отчетов, длина которых составляет до 11 089 998 байт, но все, что превышает это (скажем, 11 089 999 байт), возвращает нулевое значение в JavaScript. Мне нужно вернуть отчет размером 11 711 711 байт, который, вероятно, увеличится, но не более 13 МБ.

В файле Web.config у меня есть:

<system.web>
    <httpRuntime targetFramework="4.5" maxRequestLength="2097151" executionTimeout="3600"/>
</system.web>

<system.web.extensions>
  <scripting>
      <webServices>
          <jsonSerialization maxJsonLength="2147483647" />
      </webServices>
  </scripting>
</system.web.extensions>

Вот соответствующие строки из WebMethod:

 [System.Web.Services.WebMethod]
 public static byte[] DownloadReport(string opt, string type, string arg)
 {
     byte[] report = new byte[0];

     // Misc code to get the SSRS URL

     using (System.Net.WebClient client = new System.Net.WebClient())
     {
         client.UseDefaultCredentials = true;
         byte[] data = client.DownloadData(url);
         string path = HttpContext.Current.Server.MapPath(fileName);
         File.WriteAllBytes(path, data);

         using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read))
         {
             report = new byte[fs.Length];
             fs.Read(report, 0, (int)fs.Length);
         }
         File.Delete(path);
     }
     return report;
 }

А вот вызов и ответный вызов JavaScript PageMethod:

 PageMethods.DownloadReport(opt, type, arg, DownloadReportCallback, ReportErrors);

 function DownloadReportCallback(results) {
    var bytes = new Uint16Array(results.length);
    for (var i = 0; i < results.length; i++) {
        bytes[i] = results[i];
    }
    var file = new Blob([bytes], { type: mime });
    // For IE10+
    if (window.navigator.msSaveOrOpenBlob) {
        window.navigator.msSaveOrOpenBlob(file, name);
    }
    // For other browsers.    
    else {
        var a = document.createElement("a"),
        url = URL.createObjectURL(file);
        a.href = url;
        a.download = name;
        document.body.appendChild(a);
        a.click();
        setTimeout(function () {
            document.body.removeChild(a);
            window.URL.revokeObjectURL(url);
        }, 0);
     }
  }

Я пытался и пытался, но не могу заставить это работать для отчетов размером более 11 089 998 байт. У кого-нибудь есть идеи? Спасибо за ваше время.

1 ответ

Решение

У меня были случаи, когда webconfig не работал, и мне нужно было установить его на сериализаторе в методе.

JavaScriptSerializer serializer = new JavaScriptSerializer();

serializer.MaxJsonLength = Int32.MaxValue; 

return serializer.Serialize(response);
Другие вопросы по тегам