使用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”}),但没有任何效果。我错过了什么?
答案 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;