3

次のエラーが発生しています。

Project.ModelTypeタイプのオブジェクトの逆シリアル化中にエラーが発生しました。XMLデータの読み取り中に、文字列コンテンツの最大長クォータ(8192)を超えました。このクォータは、XMLリーダーの作成時に使用されるXmlDictionaryReaderQuotasオブジェクトのMaxStringContentLengthプロパティを変更することで増やすことができます。

MaxStringContentLengthWCFサービスのサイズを大きくする方法を示す記事やフォーラムの投稿などがたくさんあります。私が経験している問題は、これらの例のすべてが、私たちが使用していないバインディングを使用していることです。web.configサービスプロジェクトには、バインディングやエンドポイント構成は設定されていません。.svcファイルではなく.csファイルを使用しています。RESTfulWCFサービスを実装しました。

クライアント側ではWebChannelFactory、サービスの呼び出しに使用しています。

ASP.NET 4.0

何か案は?

4

1 に答える 1

1

あなたはバインディングを持っています、それはあなたの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();
    }
}
于 2011-08-10T16:53:30.740 に答える