MobileServiceClient MobileServiceInvalidOperationException响应内容为空

时间:2017-03-08 07:41:34

标签: xamarin.forms asp.net-web-api2 azure-mobile-services mobileserviceclient

我在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.");

任何帮助都将不胜感激。

2 个答案:

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

<强>结果

enter image description here