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);