WCF + REST, увеличение MaxStringContentLength
Мы сталкиваемся со следующей ошибкой:
Произошла ошибка при десериализации объекта типа Project.ModelType. Максимальная квота длины строки содержимого (8192) была превышена при чтении данных XML. Эту квоту можно увеличить, изменив свойство MaxStringContentLength в объекте XmlDictionaryReaderQuotas, используемом при создании средства чтения XML.
Существует множество статей, сообщений на форуме и т. Д., Показывающих, как увеличить MaxStringContentLength
размер для службы WCF. Проблема, с которой я сталкиваюсь, состоит в том, что во всех этих примерах используется Binding, который мы не используем. У нас нет привязок или конфигураций конечных точек, настроенных в web.config
нашего сервисного проекта. Мы используем файлы.cs, а не файлы.svc. Мы внедрили сервисы RESTful WCF.
На стороне клиента мы используем WebChannelFactory
позвонить в наши услуги.
ASP.NET 4.0
Есть идеи?
1 ответ
У вас есть привязка, просто WebChannelFactory
настраивает его для вас автоматически. Оказывается, эта фабрика всегда создает конечную точку с WebHttpBinding
, так что вы можете изменить свойства привязки перед созданием первого канала из него - см. пример ниже.
public class Stackru_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();
}
}