Прежде всего, я новый разработчик, поэтому заранее прошу прощения, если я пропущу что-то очевидное.Ошибки при плохом запросе при попытке опубликовать большие данные JSON
Я разрабатываю веб-приложение для работы в автономном режиме с большими объемами данных в IndexedDB. Когда пользователь переходит к webapp, клиент захватывает всю базу данных с сервера и сохраняет ее для использования в indexeddb. Это работает отлично, но когда я пытаюсь использовать метод post для отправки данных (снова несколько записей) обратно в WCF, я получаю метод не разрешен или плохой запрос при попытке отправить параметр тела ajax, и когда я использую uri, он попадает на сервер, но не все данные отправляются. Я думал, что, возможно, недопустимые символы могут быть фактором, поэтому я использовал метод encodeURIComponent в javascript для преобразования недопустимых символов в действительный параметр uri. Я также попытался сжать данные с помощью javacript-сжатия api под названием LZString. Я пробовал использовать XMLHttpRequest (чего я не совсем понимаю). Этот webapp должен работать в автономном режиме, поэтому я не могу выполнить вызов сервера, кроме как для первоначального получения данных при первом открытии клиента и для синхронизации данных с сервером, поэтому я должен отправлять большие объемы данных за раз.
Я также использую обертку IndexedDB под названием Dexie.js.
Образцы моего кода ниже. Некоторый код прокомментирован, но остается показать, что я пробовал.
Это то, что я есть на сервере ..
[OperationContract]
[WebInvoke(Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "REST_SendCompletedServiceOrders",
BodyStyle = WebMessageBodyStyle.Wrapped)]
[FaultContract(typeof (Exception))]
bool REST_SendCompletedServiceOrders(string compressedWebData);
Это событие щелчка на клиенте используется для синхронизации назад ..
$('#syncCompletedData').on('click', function() {
db.ServiceOrder
.toArray(function(so) {
var completedServiceOrders = [];
for (var i = 0; i < so.length; i++) {
if (so[i].IsCompleted) {
completedServiceOrders.push(so[i]);
};
}
var customerId = sessionStorage.getItem("customerId");
var companyId = sessionStorage.getItem("companyId");
var computerId = sessionStorage.getItem("computerId");
var webData = JSON.stringify({ webCustomerId: customerId, webCompanyId: companyId, webComputerId: computerId, webServiceOrder: completedServiceOrders });
alert(webData);
alert("before compression is " + webData.length);
var URIEncodedWebData = encodeURIComponent(webData);
var JSONWebData = JSON.stringify(URIEncodedWebData);
var compressedWebData = LZString.compressToUTF16(JSONWebData);
alert("after compression is " + compressedWebData.length);
debugger;
try {
$.ajax({
type: "POST",
url: "MFSRemoteDataService/REST_SendCompletedServiceOrders",
contentType: "application/json; charset=utf-8",
dataType: "json",
data: { compressedWebData: compressedWebData },
success: function(data) { alert(JSON.stringify(data)); },
failure: function(errMsg) {
alert(errMsg);
}
});
} catch (e) {
alert(e);
}
});
});
До длины данных сжатия составляет 7707. После сжатия данных длина составляет 1831.
ance для любой помощи, обратной связи, критики и т. д.
Как вы думаете, вы пытались увеличить свойство MaxJSONLength в web.config вашего WCF? –
Да, я пробовал это –
Проблема в том, что вы не отправляете данные, а сколько WCF может принимать. см. [Похожие] (http://stackoverflow.com/questions/884235/wcf-how-to-increase-message-size-quota) – juanvan