我在Xamarin Forms应用中使用以下代码:
HttpResponseMessage response = null;
try
{
HttpContent content = new StringContent(JsonConvert.SerializeObject(register), Encoding.UTF8, "application/json");
response = await client.InvokeApiAsync("register", content, HttpMethod.Post, null, null);
if (!response.IsSuccessStatusCode)
{
string error = await response.Content.ReadAsStringAsync();
var def = new { Message = "" };
var errorMessage = JsonConvert.DeserializeAnonymousType(error, def);
return KloverResult.BuildError(true, errorMessage.Message);
}
}
catch (MobileServiceInvalidOperationException e)
{
if (e.Response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
{
string error = await e.Response.Content.ReadAsStringAsync();
var def = new { Message = "" };
var errorMessage = JsonConvert.DeserializeAnonymousType(error, def);
return KloverResult.BuildError(true, errorMessage.Message);
}
else
{
return KloverResult.BuildError(false, "Invalid username or password");
}
}
我遇到的问题是由于500引发了MobileServiceInvalidOperationException。当我尝试读取响应的内容(e.Response.Content)时,它是null。当我使用Restlet调用相同的API时,我得到以下响应:
{
"Message": "Name jblogs is already taken."
}
这是我期望在我的错误变量中,但它是空的。
我的问题是,我是否应该阅读回复的内容?如果是这样,我是否需要在客户端/服务器上进行更多设置?被调用的API使用以下命令从webapi返回错误:
Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Name jblogs is already taken.");
任何帮助都将不胜感激。
答案 0 :(得分:0)
500响应表示服务器崩溃。在这种情况下,可能没有内容。
如果你的API返回status = 500,那么它做错了。您应该做的是返回400系列中的状态 - 409(冲突)对我来说似乎是合适的。
如果您的API未故意返回状态= 500,则服务器崩溃且您无法获取内容。
答案 1 :(得分:0)
根据您的描述,我使用自定义WebApi端点构建了我的移动应用程序应用程序来测试此问题。根据我的测试,我利用Microsoft.Azure.Mobile.Client 3.1.0来调用自定义WebApi,当响应状态为409或500时,我可以通过Response.Content.ReadAsStringAsync()
检索内容,依此类推。这是我的代码片段,您可以参考它们:
<强>的WebAPI 强>
[MobileAppController]
public class ValuesController : ApiController
{
public async Task<HttpResponseMessage> Get()
{
await Task.Delay(TimeSpan.FromSeconds(2));
return Request.CreateErrorResponse(HttpStatusCode.Conflict, "Name jblogs is already taken.");
}
}
客户端应用
try
{
MobileServiceClient client = new MobileServiceClient("https://bruce-chen-002.azurewebsites.net/");
var response = await client.InvokeApiAsync("/api/values", HttpMethod.Get, null);
}
catch (MobileServiceInvalidOperationException e)
{
if (e.Response.StatusCode == System.Net.HttpStatusCode.InternalServerError)
{
string error = await e.Response.Content.ReadAsStringAsync();
}
}
<强>结果强>