Установка максимального размера для ObjectContent Web API Preview 5 - PullRequest
2 голосов
/ 02 ноября 2011

Когда я использую объект 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);

Как мне изменить настроенный размер на что-то большее, чем 65536?

Ответы [ 3 ]

2 голосов
/ 03 ноября 2011

Поскольку проблема заключается в методе расширения 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);
}
1 голос
/ 02 ноября 2011

Существует ветка об этом. Попробуйте использовать 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 голосов
/ 03 ноября 2011

Попробуйте это для клиента:

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