Xamarin Forms, проблема с Android и HttpClient

Я создал в Xamarin Forms для iOS функцию HttpClient для отправки изображения с устройства на мой сервер. Основная функция

var content = new MultipartFormDataContent();

var fileContent = new ByteArrayContent(fileBytes);
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("multipart/form-data");
fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
    FileName = fName
};
fileContent.Headers.ContentDisposition.Parameters
                   .Add(new NameValueHeaderValue("userId", UserId.ToString()));
content.Add(fileContent);

using (var client = new HttpClient()) {
    client.DefaultRequestHeaders.Add("authenticationToken", SyncData.Token);

    HttpResponseMessage response = await client.PostAsync(url, content);
    if (response.IsSuccessStatusCode)
    {
        // more code
    }
}

Я использую System.Net.Http. Я пытался использовать ту же функцию для проекта в Android, но, к удивлению, она не работает. Проблема в шапке: если я просматриваю fileContent то вижу все ключи но для вебапи на сервере FileName не принимается.

После некоторых журналов я изменил эту функцию, добавив больше client.DefaultRequestHeaders вроде

client.DefaultRequestHeaders.Add("FileName", fName);

Теперь webapi получает параметр FileName.

Теперь мой вопрос: что я сделал не так?


person Enrico    schedule 07.06.2017    source источник


Ответы (1)


Лично я использую метод Add для MultipartFormDataContent, который принимает имя файла.

var content = new MultipartFormDataContent();
var fileContent = new ByteArrayContent(fileBytes);

...

// Use the overload Add method which accepts a file name
content.Add(fileContent, "FileName", fName);

...

Я не уверен, решит ли это вашу проблему или нет, но это работает для меня.

person Will Decker    schedule 07.06.2017
comment
Спасибо @deckerton_9000, я решил проблему с client.DefaultRequestHeaders.Add("FileName", fName);. Моя проблема в том, что мой httpclient не может быть разделен между iOS и Android. - person Enrico; 07.06.2017
comment
Рассматривали ли вы возможность использования пакета nuget Microsoft.Net.Http? Это должно быть совместимо как для Android, так и для iOS. Примечание. Перед добавлением этого nuget вам придется удалить ссылки проекта на System.Net.Http, чтобы избежать конфликтов пространств имен и перенаправлений привязки. - person Will Decker; 07.06.2017
comment
Если вы используете переносимую библиотеку классов, вы определенно можете использовать код HttpClient между Android и iOS. - person Will Decker; 07.06.2017
comment
Да, я знаю, но в этом случае я должен проверить Device.RuntimePlatform и выполнить два разных кода, один для iOS и один для Android. - person Enrico; 08.06.2017