0

我在 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)时,它为空。当我使用 Restlet 调用相同的 API 时,我得到以下响应:

{
"Message": "Name jblogs is already taken."
}

这是我期望在我的错误变量中的内容,但它为空。

我的问题是,我应该能够阅读响应的内容吗?如果是这样,我是否需要在客户端/服务器上进行更多设置?被调用的 API 使用以下方式从 webapi 返回错误:

Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Name jblogs is already taken.");

任何帮助,将不胜感激。

4

2 回答 2

0

根据您的描述,我使用自定义 WebApi 端点构建了我的移动应用程序应用程序来测试此问题。根据我的测试,我利用Microsoft.Azure.Mobile.Client 3.1.0调用自定义 WebApi,我可以通过Response.Content.ReadAsStringAsync()响应状态为 409 或 500 等来检索内容。这是我的代码片段,您可以参考它们:

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

结果

在此处输入图像描述

于 2017-03-13T09:39:43.967 回答
0

500 响应意味着服务器崩溃。在那种情况下,很可能没有内容。

如果您的 API 返回 status=500,那么它做错了事。您应该做的是返回 400 系列中的状态 - 409(冲突)对我来说似乎合适。

如果您的 API 没有故意返回 status=500,则服务器崩溃并且您无法获取内容。

于 2017-03-08T19:31:00.810 回答