#asp.net-mvc-3 #wcf-web-api
#asp.net-mvc-3 #wcf-web-api
Вопрос:
Когда я использую объект ObjectContent для создания HttpContent для отправки запроса через HttpClient в службу веб-API, я получаю следующую ошибку:
Невозможно записать в буфер больше байтов, чем настроенный максимальный размер буфера: 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:
Поскольку проблема заключается в методе расширения 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) amp;amp; (content.Headers.ContentType.CharSet != null))
{
encoding = Encoding.GetEncoding(content.Headers.ContentType.CharSet);
}
return encoding.GetString(bufferedContent.GetBuffer(), 0, (int)bufferedContent.Length);
}
Комментарии:
1. Я не совсем уверен, как это помогает. Как бы я «сказал» HttpClient использовать этот метод?
2. Когда вы внедрили метод расширения, попробуйте использовать content. ReadAsLargeString()
3. Метод post HttpClient принимает ссылочный указатель HttpContent, а не строку.
4. Приношу свои извинения за то, что недостаточно внимательно прочитал вопрос. Вы пробовали? HttpClient client = новый HttpClient(новый HttpClientHandler { MaxRequestContentBufferSize = int.MaxValue }); client.MaxResponseContentBufferSize = int.MaxValue;
Ответ №2:
Об этом есть тема. Попробуйте использовать 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);
Комментарии:
1. Если я добавлю MessageBox. Показать (содержимое. ReadAsString()); сразу после содержимого переменной = … строка выдает мне ту же ошибку.
2. Я обновил ответ. Возможно, вам потребуется взглянуть на источник, чтобы понять, почему он это делает.
Ответ №3:
Попробуйте это для клиента:
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;
}
}