0

我使用的Xamarin下面的代碼窗體應用程序:MobileServiceClient MobileServiceInvalidOperationException響應內容爲空

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

說我遇到的問題是,當一個MobileServiceInvalidOperationException被拋出的500當結果我嘗試讀取響應(e.Response.Content)的內容爲空。當我使用Restlet調用相同的API時,我得到以下響應:

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

這是我期望在我的錯誤變量中,但它是空的。

我的問題是,我應該能夠讀取響應的內容?如果是這樣,我是否需要在客戶端/服務器上進行更多設置?被調用的API將返回錯誤形式的webapi使用:

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

任何幫助,將不勝感激。

回答

0

500響應表示服務器崩潰。這種情況可能沒有內容。

如果您的API返回status = 500,那麼它做錯了事情。你應該做的是返回400系列的狀態--409(衝突)對我來說似乎是合適的。

如果你的API沒有故意返回status = 500,那麼服務器崩潰了,你沒有得到內容。

+0

服務器故意返回500 - 將嘗試您對400系列錯誤的建議,並查看客戶端如何處理該錯誤 – markpirvine

+0

當我使用409時,響應的內容仍然爲空 – markpirvine

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