WCF + REST, увеличение MaxStringContentLength - PullRequest
3 голосов
/ 10 августа 2011

Мы сталкиваемся со следующей ошибкой:

Произошла ошибка десериализации объекта типа Project.ModelType.Максимальная квота длины строки содержимого (8192) была превышена при чтении данных XML.Эту квоту можно увеличить, изменив свойство MaxStringContentLength в объекте XmlDictionaryReaderQuotas, используемом при создании средства чтения XML.

Существует множество статей, сообщений на форуме и т. Д., Показывающих, как увеличить MaxStringContentLength размер для сервиса WCF.Проблема, с которой я сталкиваюсь, состоит в том, что во всех этих примерах используется Binding, который мы не используем.У нас нет привязок или конфигураций конечных точек, настроенных в web.config нашего сервисного проекта.Мы используем файлы .cs, а не файлы .svc.Мы внедрили службы RESTful WCF.

На стороне клиента мы используем WebChannelFactory для вызова наших услуг.

ASP.NET 4.0

Есть идеи?

1 Ответ

1 голос
/ 10 августа 2011

У вас есть привязка, просто WebChannelFactory настраивает ее для вас автоматически. Оказывается, эта фабрика всегда создает конечную точку с WebHttpBinding, поэтому вы можете изменить свойства привязки перед созданием первого канала из нее - см. Пример ниже.

public class StackOverflow_7013700
{
    [ServiceContract]
    public interface ITest
    {
        [OperationContract]
        string GetString(int size);
    }
    public class Service : ITest
    {
        public string GetString(int size)
        {
            return new string('r', size);
        }
    }
    public static void Test()
    {
        string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
        WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
        host.Open();
        Console.WriteLine("Host opened");

        WebChannelFactory<ITest> factory = new WebChannelFactory<ITest>(new Uri(baseAddress));
        (factory.Endpoint.Binding as WebHttpBinding).ReaderQuotas.MaxStringContentLength = 100000;
        ITest proxy = factory.CreateChannel();
        Console.WriteLine(proxy.GetString(100).Length);

        try
        {
            Console.WriteLine(proxy.GetString(60000).Length);
        }
        catch (Exception e)
        {
            Console.WriteLine("{0}: {1}", e.GetType().FullName, e.Message);
        }

        ((IClientChannel)proxy).Close();
        factory.Close();

        Console.Write("Press ENTER to close the host");
        Console.ReadLine();
        host.Close();
    }
}
...