Xamarin iOS добавляет заголовок Content-Length в HttpClient, выдает ошибку

Я пытаюсь использовать HttpClient для загрузки файла в хранилище BLOB-объектов Microsoft Azure через REST API в Xamarin.iOS. Все идет нормально до сих пор. Каждый раз, когда я пытаюсь добавить заголовок Content-Length к клиенту, я получаю эту ошибку:

System.InvalidOperationException: Content-Length\n  at System.Net.Http.Headers.HttpHeaders.CheckName (System.String name) [0x0005f] in /Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:253 \n  at System.Net.Http.Headers.HttpHeaders.Add (System.String name, IEnumerable`1 values) [0x00011] in /Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:171 \n  at System.Net.Http.Headers.HttpHeaders.Add (System.String name, System.String value) [0x00000] in /Developer/MonoTouch/Source/mono/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs:163 

Это мой код для создания HttpClient

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Add("Content-Length", blobLength.ToString()); // Error here
client.DefaultRequestHeaders.Add("x-ms-date", dateInRfc1123Format);
client.DefaultRequestHeaders.Add("x-ms-version", msVersion);
Debug.WriteLine("Added all headers except Authorization");
client.DefaultRequestHeaders.Add("Authorization", authorizationHeader);


Debug.WriteLine("Added Authorization header");
//logRequest(requestContent, uri);

Debug.WriteLine("created new http client");
HttpContent requestContent = new ByteArrayContent(blobckContent);
HttpResponseMessage response = await client.PutAsync(uri, requestContent);

Я попытался использовать TryAddWithoutValidation вместо Add:

client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Length", blobLength.ToString());

Ошибка не возникает, но заголовок по-прежнему не добавляется. Любая помощь будет здорово.


person JacobK    schedule 07.04.2015    source источник


Ответы (1)


Вот внутренняя работа CheckName(), которая генерирует исключение. Вы можете найти исходный код здесь: https://github.com/mono/mono/blob/master/mcs/class/System.Net.Http/System.Net.Http.Headers/HttpHeaders.cs

HeaderInfo CheckName (string name)
    {
        if (string.IsNullOrEmpty (name))
            throw new ArgumentException ("name");

        Parser.Token.Check (name);

        HeaderInfo headerInfo;
        if (known_headers.TryGetValue (name, out headerInfo) && (headerInfo.HeaderKind & HeaderKind) == 0) {
            if (HeaderKind != HttpHeaderKind.None && ((HeaderKind | headerInfo.HeaderKind) & HttpHeaderKind.Content) != 0)
                throw new InvalidOperationException (name);

            return null;
        }

        return headerInfo;
    }

После просмотра полного исходного файла:

Похоже, что Content-Length находится в коллекции known_headers.

Также похоже, что внутренний тип значения заголовка Content-Length является длинным. Но метод Add() принимает только строку для значения, которое анализируется как длинное. Является ли строковое значение, которое вы передаете для значения Content-Length, допустимым длинным?

person NovaJoe    schedule 08.04.2015