C # - сторона сервера WebMethod возвращает большой байт [] как ноль клиенту - PullRequest
0 голосов
/ 28 августа 2018

У меня есть серверный 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 Ответ

0 голосов
/ 28 августа 2018

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

JavaScriptSerializer serializer = new JavaScriptSerializer();

serializer.MaxJsonLength = Int32.MaxValue; 

return serializer.Serialize(response);
...