Установка максимального размера для предварительного просмотра веб-API ObjectContent 5

#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;
    }
}