Длина цепи преодолевает стоимость, установленную в свойстве maxJsonLenght

я посылаю через Аякса изображение в Base64, это, из-за чего я использую PlugIn Апачи Cordova, чтобы снимать. Результат в Base64 я это посылаю в сервер MVC в JsonResult. Проблема состоит в том, что, когда цепь очень длинная, сервер возвращает мне ошибку титула, уже я попробовал менять webconfig для того, чтобы JavaScriptSerializer принял больше данных, но без результатов.

Нужно отмечать, что я получаю данные, не посылаю.

introducir la descripción de la imagen aquí

Здесь мой код HTML.

 function subir(imageData) {

        var x = "data:image/png;base64," + imageData;
        //imageData es la Base64 de la imagen
        $.ajax({
            type: 'POST',
            url: uri,
            data: JSON.stringify({ base64image: x }),
            dataType: 'json',
            contentType: 'application/json',
            success: function (data) {
                alert(data);
            },
            error: function (xhr) {

            }
        });
    }

И мой код MVC

[HttpPost]
    public JsonResult GuardarImagenBase64(string base64image)  
    {


        if (string.IsNullOrEmpty(base64image))
            return Json(0);

        var t = base64image.Substring(22);  // remove data:image/png;base64,

        byte[] bytes = Convert.FromBase64String(t);

        Image image;
        using (MemoryStream ms = new MemoryStream(bytes))
        {
            image = Image.FromStream(ms);
        }
        var randomFileName = Guid.NewGuid().ToString().Substring(0, 4) + DateTime.Now.Ticks + ".png";
        var fullPath = Path.Combine(Server.MapPath("~/Content/img/"), randomFileName);
        image.Save(fullPath, System.Drawing.Imaging.ImageFormat.Png);

        return Json(1);
    }

В моем Web.config

  


  
    
    
//Omití esto pero si tengo mi conexión

Что я должен делать, чтобы мочь способствовать тому, чтобы он принял большие данные? Маленькие изображения нет проблемы, но благодаря тому, что это подвижное приложение, и как правило фотографии камеры - много веса всегда происходит это.

3
задан 22.06.2018, 08:54
3 ответа

Ok уже я смог решать это. Для этого я был должен создавать измененный класс, который приходит по умолчанию в Визуальном Studio, который является классом JsonValueProviderFactory.

Внутри App_Start верит в новый класс, который называл бы ее CustomJsonValueProviderFactory и это копировал и прикрепите:

public sealed class CustomJsonValueProviderFactory : ValueProviderFactory
{

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

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

        // primitive
        backingStore[prefix] = value;
    }

    private static object GetDeserializedObject(ControllerContext controllerContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
        {
            // not JSON request
            return null;
        }

        StreamReader reader = new StreamReader(controllerContext.HttpContext.Request.InputStream);
        string bodyText = reader.ReadToEnd();
        if (String.IsNullOrEmpty(bodyText))
        {
            // no JSON data
            return null;
        }

        JavaScriptSerializer serializer = new JavaScriptSerializer();
        serializer.MaxJsonLength = int.MaxValue; //increase MaxJsonLength.  This could be read in from the web.config if you prefer
        object jsonData = serializer.DeserializeObject(bodyText);
        return jsonData;
    }

    public override System.Web.Mvc.IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        if (controllerContext == null)
        {
            throw new ArgumentNullException("controllerContext");
        }

        object jsonData = GetDeserializedObject(controllerContext);
        if (jsonData == null)
        {
            return null;
        }

        Dictionary<string, object> backingStore = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
        AddToBackingStore(backingStore, String.Empty, jsonData);
        return new System.Web.Mvc.DictionaryValueProvider<object>(backingStore, CultureInfo.CurrentCulture);
    }

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

Этот класс то, что он делает, состоит в том, чтобы лишать его предела JSON и помещает это int32.MaxValue

эти Using требуются:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Web.Mvc;
using System.Web.Script.Serialization;

В конце концов в Global.asax внутри ключей Application_Start ()

JsonValueProviderFactory jsonValueProviderFactory = null;

        foreach (var factory in ValueProviderFactories.Factories)
        {
            if (factory is JsonValueProviderFactory)
            {
                jsonValueProviderFactory = factory as JsonValueProviderFactory;
            }
        }

        //remove the default JsonVAlueProviderFactory
        if (jsonValueProviderFactory != null) ValueProviderFactories.Factories.Remove(jsonValueProviderFactory);

        //add the custom one
        ValueProviderFactories.Factories.Add(new CustomJsonValueProviderFactory());

Будет являться необходимым, чтобы в Global.asax они использовали один Using NombreDeProyecto.App_Start со ссылкой на их собственный проект, а они понимают, как то, что я говорю, используйте Действия rГЎpidas и переоснование фактории.

0
ответ дан 20.11.2019, 07:50

В тебе Web.Config добавляет следующую configuraciГіn:

<configuration>
  <system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="1073741824"/>
        <!-- Esto representa 1Gb -->
      </webServices>
    </scripting>
  </system.web.extensions>
</configuration>

рекомендуемое Чтение: https://msdn.microsoft.com/en-us/library/bb763183.aspx

1
ответ дан 20.11.2019, 07:50
  • 1
    Привет @fredyfx, я верю, чем с этой configuració n не была бы решена проблема. Этот pará метр показывает максимальное число элементов, которые могут deserializar. OP ссылается на tamañ или Json, не числа элементов. – Sergio Parra Guerra 21.06.2018, 14:16
  • 2
    скопированный, обновляя ответ :) – fredyfx 21.06.2018, 14:17
  • 3
    PD: это первый раз в 2 añ вы и способ (quizá s немножко má s), где они помещают ему негатив в какой-то ответ, который я дал. Следующие вопросы leeré с большей скрупулезностью, чтобы предотвращать путаницу :D – fredyfx 21.06.2018, 14:20
  • 4
    Уже я это добавил и я не функционирую – Daisuke Dany 21.06.2018, 14:24
  • 5
    ¿ Podrí схвати добавлять твой web.config пожалуйста? – fredyfx 21.06.2018, 14:28

Возможно, что estГ©s преодолевая с избытком предел, который IIS считает помеченным по умолчанию для tamaГ±o просьбами. Измени твой web.config добавляя следующее

<configuration>
    <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
         <standardEndpoints>           
        <webHttpEndpoint>
     <standardEndpoint name="" helpEnabled="true"automaticFormatSelectionEnabled="false" defaultOutgoingResponseFormat="Json" crossDomainScriptAccessEnabled="true" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" /> 
        </webHttpEndpoint>
      </standardEndpoints>
    </system.serviceModel>
    <system.webServer>
            <security>
                <requestFiltering>
                    <requestLimits maxAllowedContentLength=”524288000″/>
                </requestFiltering>
            </security>
    </system.webServer>
  </configuration>

tamaГ±o показанный maxAllowedContentLength он в байт.

0
ответ дан 20.11.2019, 07:50
  • 1
    PD: Сочетай эту configuració n с показанным в ответе @fredyfx – Sergio Parra Guerra 21.06.2018, 15:02
  • 2
    Оно не функционировало – Daisuke Dany 22.06.2018, 07:08
  • 3
    Привет ты можешь помещать в твоем вопросе configuració n твоего web.config? – Sergio Parra Guerra 22.06.2018, 07:09
  • 4
    Уже я это добавил – Daisuke Dany 22.06.2018, 07:11
  • 5
    Привет, сообщение ошибки - то же самое? Я буду издавать мой ответ, чтобы добавлять больше конфигураций к твоему web.config – Sergio Parra Guerra 22.06.2018, 07:29

Теги

Похожие вопросы