InvokeApiAsync在StringContent上返回415(Monodroid / Xamarin.Android)

时间:2015-09-09 06:54:05

标签: c# json azure asp.net-web-api xamarin.android

使用Xamarin Studio,使用Azure移动服务+ .NET后端自定义托管API(WebApi 2)制作Xamarin.Android应用程序。我知道我的移动服务正在运行,因为我可以看到我的应用程序正在日志中点击它。这是我的自定义api的签名:

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

我正在尝试使用InvokeApiAsync触发此操作,尝试了一些重载,但我尝试使用Raw Http one。我的字符串是jpg,已被转换为base 64;如果我将字符串直接输入到我的移动服务测试网站,它可以正常工作。

我的问题是,我得到了415不受支持的实体媒体类型(文本/纯文本)错误。

  

Message ='UserMessage ='请求实体的媒体类型'text / plain'是   此资源不支持。'',状态= 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);

我还尝试了以下版本(以及以下各项的组合)将content-type定义为application / json;这些命中了API,但输入参数为null,因此方法失败:

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);

我也尝试将字符串切换为json(如{“imageInBase64”=“xxxxlotofcharactersinbase64”}),但没有任何效果。我错过了什么?

1 个答案:

答案 0 :(得分: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不支持的实体媒体类型(text / plain)错误;不幸的是,呼叫仍然在客户端失败,在呼叫时冻结并且从未注册响应(尽管我的服务器确认已经发回200的响应)。

我最终通过从InvokeApiAsync中删除async / await来修复此问题。或者我没有正确使用它们,或者我的应用程序在尝试等待时失败了。电话永远不会完成。相反,我更改了这些以获取异步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;