powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Error 500 при post файла 2мб
15 сообщений из 15, страница 1 из 1
Error 500 при post файла 2мб
    #39948495
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер.

Не подскажите, в чём может быть проблема ? Или как её правильно диагностировать ?
На сервере(IIS Express) есть метод, который принимает post запрос.
Запрос в этот метод делает такой код:
Код: c#
1.
 MyHttpClient.Post('http://192.168.1.106:55062/Home/UploadJson',File.ReadAllText('C:\App.json')); //Размер Json = 2.3 МБ 


Но вылетает ошибка: An error occurred while processing your request.
HttpStatusCode = 500
т.е. до метода контроллера даже не доходит.

Как только я уменьшаю размер файл Json через Notepad.exe до ~1.3мб(и менее) - всё работает.

На стековерфлоу написано, что надо поставить в Web.config значения ниже. Я их поставил, но ничего не изменилось.

</appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="16384000"/>

<system.web>
<httpRuntime targetFramework="4.6.1" maxRequestLength="16384000"/>

<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="3276800000"/>
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948501
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что в стеке исключения на сервере?
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948508
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Не понял, о чём ты и где это посмотреть ?

До метода контроллера не доходит, я не могу поставить точку остановки.
Точнее могу, но она не срабатывает, пока файл 2мб
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948523
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B
не могу поставить точку остановки.
Я сталкивался с тем, что десериализатор JSON не переваривал файлы большого объема. Так что погугли, как включить трассировку или каким-то иным способом увидеть детали исключения.
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948530
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
customErrors поставь в off и увидишь в ответе стек вызовов где обрывается ексепшеном. это если старый асп.нет. если коре, то запусти кастрюлю в консольном режиме - там ексепшен будет в консоли. а вообще хороший практис - в любом проекте первым делом обустраивать логгирование.
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948561
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
customErrors поставь в off и увидишь в ответе стек вызовов где обрывается ексепшеном. это если старый асп.нет. если коре

судя по: httpRuntime targetFramework="4.6.1", - это не core

а в .NET Framework JavaScriptSerializer-е есть забавный баг: если POST запросу указать, что тип контента JSON, то с какого-то размера начинает падать и на настройки по фигу
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
      <ExceptionType>System.ArgumentException, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType>
      <Message>Error during serialization or deserialization using the JSON JavaScriptSerializer. The length of the string exceeds the value set on the maxJsonLength property.
Parameter name: input</Message>
      <Source>System.Web.Extensions</Source>
      <HelpLink></HelpLink>
      <Property name=ParamName>input</Property>
      <Property name=Data>System.Collections.ListDictionaryInternal</Property>
      <Property name=TargetSite>System.Object Deserialize(System.Web.Script.Serialization.JavaScriptSerializer, System.String, System.Type, Int32)</Property>
      <Property name=HResult>-2147024809</Property>
      <StackTrace>   at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
   at System.Web.Mvc.JsonValueProviderFactory.GetDeserializedObject(ControllerContext controllerContext)
   at System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext)
   at System.Web.Mvc.ValueProviderFactoryCollection.<>c__DisplayClassc.<GetValueProvider>b__7(ValueProviderFactory factory)
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at System.Web.Mvc.ValueProviderFactoryCollection.GetValueProvider(ControllerContext controllerContext)
   at System.Web.Mvc.ControllerBase.get_ValueProvider()
   at System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext controllerContext, ParameterDescriptor parameterDescriptor)
   at System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
   at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__1e(AsyncCallback asyncCallback, Object asyncState)</StackTrace>



если не указывать тип контента, вернее просто указать contentType: "charset=utf-8", - то всё хорошо
либо надо подсовывать свою ValueProviderFactory, использовать Json.NET
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948568
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
с какого-то размера начинает падать и на настройки по фигу

Это логично, если бага в самом Json сериалайзере.

Можно попробовать параметры акции заменить просто на HttpRequestMessage и посмотреть - дойдет ли в этом случае выполнение до неё. Если да, то, стопроцентно виноват сериалайзер, тогда можно попробовать обходные пути - десериализовывать ккаим-либо другим способом, а не тем что в дефолтный байндер вшит.
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948570
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthat
customErrors поставь в off и увидишь в ответе стек вызовов где обрывается ексепшеном.

А можно показать, где конкретно это надо поставить ? Скрин ?
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948571
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух

если не указывать тип контента, вернее просто указать contentType: "charset=utf-8", - то всё хорошо
либо надо подсовывать свою ValueProviderFactory, использовать Json.NET

Точно, почти сработало, спасибо!
т.е. уже до отладки доходит, срабатывает брейкпоинт, но объекта нет. Все его свойства = null
Не совсем понял как использовать Json.net ? это ты о Newtonsoft.Json ?
И ValueProviderFactory ?
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948573
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B
Дмитрий Мух

если не указывать тип контента, вернее просто указать contentType: "charset=utf-8", - то всё хорошо
либо надо подсовывать свою ValueProviderFactory, использовать Json.NET

Точно, почти сработало, спасибо!
т.е. уже до отладки доходит, срабатывает брейкпоинт, но объекта нет. Все его свойства = null
Не совсем понял как использовать Json.net ? это ты о Newtonsoft.Json ?
И ValueProviderFactory ?

Да, о Newtonsoft. Легко же ищется: Json.NET .

И как использовать, тоже легко ищется: https://www.google.com/search?q=ASP.NET MVC Value Provider Factory using JSON.NET

Но можно пойти и другим путём, через IModelBinder.
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948607
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух
Да, о Newtonsoft.

Если там 4.*, то точно он. А с коревским System.Text.Json уже, кстати, отгребли проблем, хоть и некритичных. Сыр еще.
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948776
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий Мух

И как использовать, тоже легко ищется: https://www.google.com/search?q=ASP.NET MVC Value Provider Factory using JSON.NET
Но можно пойти и другим путём, через IModelBinder.


Если честно, из ответа я так и не понял, что можно сделать.
Какой путь самый простой ?
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948782
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал сейчас свой IModelBinder, который return null;

Зарегистрировал его в Global.asax\ protected void Application_Start() через ModelBinders.Binders.Add

Опять не доходит до метода контроллера с ContentType = 'application/json; charset=UTF-8';
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948785
Valery_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О, походу сработало)
Интересно, вылезит ли это в каком нибудь другом месте ?)
Мне до конца не понятно, что я сделал.

Скопировал себе такой небольшой класс:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Dynamic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Json.ValueFactory
{
    public class JsonNetValueProviderFactory : ValueProviderFactory
    {
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            // first make sure we have a valid context
            if (controllerContext == null)
                throw new ArgumentNullException("controllerContext");

            // now make sure we are dealing with a json request
            if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
                return null;

            // get a generic stream reader (get reader for the http stream)
            var streamReader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
            // convert stream reader to a JSON Text Reader
            var JSONReader = new JsonTextReader(streamReader);
            // tell JSON to read
            if (!JSONReader.Read())
                return null;

            // make a new Json serializer
            var JSONSerializer = new JsonSerializer();
            // add the dyamic object converter to our serializer
            JSONSerializer.Converters.Add(new ExpandoObjectConverter());

            // use JSON.NET to deserialize object to a dynamic (expando) object
            Object JSONObject;
            // if we start with a "[", treat this as an array
            if (JSONReader.TokenType == JsonToken.StartArray)
                JSONObject = JSONSerializer.Deserialize<List<ExpandoObject>>(JSONReader);
            else
                JSONObject = JSONSerializer.Deserialize<ExpandoObject>(JSONReader);

            // create a backing store to hold all properties for this deserialization
            var backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
            // add all properties to this backing store
            AddToBackingStore(backingStore, String.Empty, JSONObject);
            // return the object in a dictionary value provider so the MVC understands it
            return new DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture);
        }

        private static void AddToBackingStore(Dictionary<string, object> backingStore, string prefix, object value)
        {
            var d = value as IDictionary<string, object>;
            if (d != null)
            {
                foreach (var entry in d)
                {
                    AddToBackingStore(backingStore, MakePropertyKey(prefix, entry.Key), entry.Value);
                }
                return;
            }

            var l = value as IList;
            if (l != null)
            {
                for (var i = 0; i < l.Count; i++)
                {
                    AddToBackingStore(backingStore, MakeArrayKey(prefix, i), l[i]);
                }
                return;
            }

            // primitive
            backingStore[prefix] = value;
        }

        private static string MakeArrayKey(string prefix, int index)
        {
            return prefix + "[" + index.ToString(CultureInfo.InvariantCulture) + "]";
        }

        private static string MakePropertyKey(string prefix, string propertyName)
        {
            return (String.IsNullOrEmpty(prefix)) ? propertyName : prefix + "." + propertyName;
        }
    }
}



И прописал его в Global.asax\ protected void Application_Start()
Код: c#
1.
2.
 ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault());
 ValueProviderFactories.Factories.Add(new JsonNetValueProviderFactory());


How to use Json.NET for JSON modelbinding in an MVC5 project?
...
Рейтинг: 0 / 0
Error 500 при post файла 2мб
    #39948799
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Valery_B
Мне до конца не понятно, что я сделал.

Воспользовались таки гуглом и скопировали код.
Хотите большего, читайте документацию и книги.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Error 500 при post файла 2мб
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]