2015-09-09 8 views
0

Использование Xamarin Studio, создание приложения Xamarin.Android с использованием API-интерфейса Azure Mobile Service + .NET Backend (WebApi 2). Я знаю, что моя мобильная служба работает, потому что я вижу, что мое приложение попадает в нее в журналы. Вот подпись моего пользовательского API:InvokeApiAsync возвращает 415 на StringContent (Monodroid/Xamarin.Android)

[HttpPost] 
[Route("postplant")] 
public HttpResponseMessage PostPlant([FromBody] string imageInBase64) 

Я пытаюсь вызвать это с помощью InvokeApiAsync, попробовали несколько перегруженные, но я пытаюсь идти с Raw Http one. Моя строка - это jpg, который был преобразован в базу 64; если я ввешу строку непосредственно на сайт для тестирования мобильных сервисов, она работает нормально.

Моя проблема в том, что я получаю 415 неподдерживаемых сущностей типа носителя (текст/обычная).

Message = 'UserMessage =' Тип носителя просьбе лица 'текст/обычный' является не поддерживается для этого ресурса. '', Status = 415 (UnsupportedMediaType), Exception = System.Web.Http.HttpResponseException : Обработка HTTP-запроса привела к исключению.

Вот мой вызов в Xamarin:

HttpContent content = new StringContent(imageInBase64, System.Text.Encoding.UTF8); 
HttpResponseMessage resp = await _service.InvokeApiAsync(@"jv/postplant", content, HttpMethod.Post, null, null); 

Я также попытался следующие версии (и комбинацию из следующих), определяющих тип содержимого как приложения/JSON в явном виде; они попали в API OK, но входной параметр приходит через утратившим, поэтому метод не может:

HttpContent content = new StringContent(imageInBase64, System.Text.Encoding.UTF8, "application/json"); 
HttpResponseMessage resp = await _service.InvokeApiAsync(@"jv/postplant", content, HttpMethod.Post, null, null); 

и

HttpContent content = new StringContent(imageInBase64, System.Text.Encoding.UTF8); 
content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
HttpResponseMessage resp = await _service.InvokeApiAsync(@"jv/postplant", content, HttpMethod.Post, null, null); 

и

HttpContent content = new StringContent(imageInBase64, System.Text.Encoding.UTF8); 
content.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 
Dictionary<string, string> reqHeaders = new Dictionary<string, string>(); 
reqHeaders.Add("ContentType", "application/json; charset=UTF-8"); 
HttpResponseMessage resp = await _service.InvokeApiAsync(@"jv/postplant", content, HttpMethod.Post, reqHeaders, null); 

Я также попытался переключения (например, «imageInBase64» = «xxxxlotofcharactersinbase64»}), но ничего не работает. Что мне не хватает?

+0

Что делает 'InvokeApi'? – Cheesebaron

+0

@ Cheesebaron вот документация из MSDN: [http://bit.ly/1UCn6LK](http://bit.ly/1UCn6LK) Он вызывает API от вашей Azure Mobile Service; в моем примере выше _service - это экземпляр [MobileServiceClient] (https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.mobileservices.mobileserviceclient.aspx) – codeMonkey

+0

Вы можете попробовать проверить трафик с помощью Fiddler, чтобы увидеть что отправляется, чтобы проверить, где это происходит. – Cheesebaron

ответ

0

Решил мою проблему. Изображение было уже в строке, но мне пришлось сериализовать его следующим образом:

string jObj = JsonConvert.SerializeObject(imageInBase64); 
StringContent content = new StringContent(jObj, System.Text.Encoding.UTF8); 
MediaTypeHeaderValue mValue = new MediaTypeHeaderValue("application/json"); 
content.Headers.ContentType = mValue; 

Это фиксированный мою (/ обычный текст) Ошибку 415 неподдерживаемых типа объекта СМИ; к сожалению, вызов по-прежнему терпел неудачу на стороне клиента, замерзая при вызове и никогда не регистрируя ответ (несмотря на то, что мой сервер, подтверждающий ответ 200, был отправлен обратно).

В конечном итоге я исправил это, удалив async/await из InvokeApiAsync; либо я не использую их должным образом, либо мое приложение терпит неудачу при попытке подождать. Вызовы никогда не завершаются. Вместо этого я изменил их, чтобы получить результат async InvokeApiAsync. Вот мое решение:

HttpResponseMessage resp = _service.InvokeApiAsync(@"jv/postplant", content, HttpMethod.Post, null, null).Result; 
_service.Dispose(); 

string result = await resp.Content.ReadAsStringAsync(); 
JToken json = JToken.Parse(result); 
return json; 
Смежные вопросы