WCF + REST,增加 MaxStringContentLength

Posted

技术标签:

【中文标题】WCF + REST,增加 MaxStringContentLength【英文标题】:WCF + REST, Increase MaxStringContentLength 【发布时间】:2011-10-24 05:31:18 【问题描述】:

我们遇到了以下错误:

反序列化类型对象时出错 项目.模型类型。最大字符串内容长度配额 (8192) 有 读取 XML 数据时超出。此配额可能会增加 更改 MaxStringContentLength 属性 创建 XML 阅读器时使用的 XmlDictionaryReaderQuotas 对象。

有大量文章、论坛帖子等,展示了如何增加 WCF 服务的 MaxStringContentLength 大小。我遇到的问题是所有这些示例都使用了我们不使用的绑定。我们的服务项目的web.config 中没有设置绑定或端点配置。我们使用的是 .cs 文件,而不是 .svc 文件。我们已经实现了 RESTful WCF 服务。

在客户端,我们使用WebChannelFactory 调用我们的服务。

ASP.NET 4.0

有什么想法吗?

【问题讨论】:

您能否向我们展示您的服务器端web.config 和客户端上用于创建代理的代码?? 错误出现在哪里?在客户端还是服务器? 尝试反序列化对象时,错误出现在服务器端。 【参考方案1】:

您确实有绑定,只是WebChannelFactory 会自动为您设置。事实证明,这个工厂总是创建一个带有WebHttpBinding 的端点,因此您可以在从它创建第一个通道之前更改绑定属性 - 请参见下面的示例。

public class ***_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();
    

【讨论】:

以上是关于WCF + REST,增加 MaxStringContentLength的主要内容,如果未能解决你的问题,请参考以下文章

WCF REST 方法和非 REST 方法

如何从基于 REST 的 WCF 服务中读取授权标头?

WCF 4.0 REST 用户名密码认证

用于 Xamarin 表单的 Rest + WCF 集成

WCF 服务的 REST / SOAP 端点

如何在 REST 模式下使用 WCF 服务?