2011-11-02 22 views
2

當我使用的ObjectContent對象創建HttpContent通過HttpClient的請求發送到我收到以下錯誤的Web API服務:設置最大大小ObjectContent的Web API預覽5

不能多寫字節緩衝區大於配置的最大緩衝區大小:65536

正在使用以下代碼發送請求。 Card對象有大約15個屬性。

var client = new HttpClient(); 
var content = new ObjectContent<IEnumerable<Card>>(cards, "application/xml"); 
MessageBox.Show(content.ReadAsString()); //This line gives me the same error. 

var response = client.Post("http://localhost:9767/api/cards", content); 

如何將配置的尺寸更改爲大於65,536的尺寸?

回答

1

這裏有一個thread。嘗試使用HttpCompletionOption.ResponseContentRead:

var message = new HttpRequestMessage(HttpMethod.Post, "http://localhost:9767/api/cards"); 
message.Content = content; 
var client = new HttpClient(); 
client.Send(message, HttpCompletionOption.ResponseContentRead); 
+0

如果我添加MessageBox.Show(content.ReadAsString());緊跟在var content = ...行之後,它給了我同樣的錯誤。 – Dean

+0

我更新了答案。你可能需要看看源代碼,看看它爲什麼這樣做。 – bkaid

+0

同樣的錯誤。現在就去挖掘來源。 – Dean

0

試試這個客戶端:

HttpClient client = new HttpClient("http://localhost:52046/"); 

// enable support for content up to 10 MB size 
HttpClientChannel channel = new HttpClientChannel() { 
    MaxRequestContentBufferSize = 1024 * 1024 * 10 
}; 

client.Channel = channel; 

在服務器(片段是基於預覽4,但你應該得到的線索):

public class CustomServiceHostFactory : HttpConfigurableServiceHostFactory { 
    public override ServiceHostBase CreateServiceHost(string constructorString, Uri[] baseAddresses) { 
     var host = base.CreateServiceHost(constructorString, baseAddresses); 

     foreach (HttpEndpoint endpoint in host.Description.Endpoints) { 
      endpoint.TransferMode = TransferMode.Streamed; 
      endpoint.MaxReceivedMessageSize = 1024 * 1024 * 10; 
     } 

     return host; 
    } 
} 
2

由於問題存在於ReadAsString擴展方法中,因此我建議您創建自己的擴展方法來解決最大緩衝區大小問題。

下面是可能解決問題的ReadAsLargeString擴展方法的示例。

public static string ReadAsLargeString(this HttpContent content) 
{ 
    var bufferedContent = new MemoryStream(); 
    content.CopyTo(bufferedContent); 

    if (bufferedContent.Length == 0) 
    { 
     return string.Empty; 
    } 

    Encoding encoding = DefaultStringEncoding; 
    if ((content.Headers.ContentType != null) && (content.Headers.ContentType.CharSet != null)) 
    { 
     encoding = Encoding.GetEncoding(content.Headers.ContentType.CharSet); 
    } 

    return encoding.GetString(bufferedContent.GetBuffer(), 0, (int)bufferedContent.Length); 
} 
+0

我不太清楚這是如何幫助的。我將如何「告訴」HttpClient使用這種方法? – Dean

+0

當你已經實現了擴展方法try with content.ReadAsLargeString() – hskan

+0

HttpClient的post方法接受一個HttpContent引用指針,而不是字符串。 – Dean