2011-08-10 55 views
3

我們正在運行到以下錯誤:WCF + REST,增加MaxStringContentLength

There was an error deserializing the object of type Project.ModelType. The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.

有一噸的文章,論壇帖子等,展示瞭如何增加MaxStringContentLength大小的WCF服務。我遇到的問題是所有這些示例都使用了Binding,我們不使用它。我們的服務項目的web.config中沒有設置綁定或端點配置。我們使用.cs文件,而不是.svc文件。我們已經實現了RESTful WCF服務。

在客戶端,我們使用WebChannelFactory來調用我們的服務。

ASP.NET 4.0

任何想法?

+1

你能告訴我們**你的服務器端'web.config'和客戶端上的代碼來創建代理嗎? –

+0

錯誤顯示在哪裏?在客戶端還是服務器? – carlosfigueira

+0

錯誤發生在服務器端,當它試圖反序列化對象時。 – mtm927

回答

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