2016-07-28 9 views
0

Ich versuche, eine Anwendung von einem azurblauen mobilen Dienst auf eine azure Webanwendung zu portieren. (Der mobile Dienst hat funktioniert). Ich habe der Web-App eine Microsoft-Konto-Authentifizierung hinzugefügt, und die Web-App-API hat ein MobileAppController-Attribut. Ich habe eine Universal Windows App Frontend, die die API aufruft. Die App prüft zuerst, ob ein Spieler in der Datenbank ist, wenn nicht, bekomme ich eine nicht gefundene Antwort. Wenn ich die Methode mit dem folgenden Code mit dem MobileServiceClient aufrufen bekomme ich eine Ausnahme.Der Mobile Service Client gibt eine Ausnahme aus, wenn die Antwort nicht gefunden wird.

private async Task<HttpResponseMessage> GetAZMAsyncP(string apiext, IDictionary<string,string> param) 
    { 
     string myuri = String.Format("{0}{1}", urlbase, apiext); 

// Client ist die MobileServiceClient, die korrekt in angemeldet ist // ich nicht Antwort erhalten, die 404 nicht gefunden ist, erhalte ich eine Ausnahme „die Anforderung konnte nicht abgeschlossen werden, nicht gefunden“ var Antwort = erwarten client.InvokeApiAsync (myuri, System.Net.Http.HttpMethod.Get, param); Antwort zurücksenden; } Wenn ich die API von einem httpclient aufrufen und meine eigenen Header hinzufügen, die der mobile Client für mich tun soll, dann bekomme ich die Antwort wie gewünscht. Hier ist der Code:

private async static Task<HttpResponseMessage> GetAZAsync(string apiext) 
    { 

     string completeUrl = String.Format("{0}{1}", urlbase, apiext); 


     // Call out to AZ 
     using (var http = new HttpClient()) 
     { 

     // http.BaseAddress = new Uri(completeUrl); 
     HttpRequestMessage rq = new HttpRequestMessage() 
     { 
      RequestUri = new Uri(completeUrl), 
      Method = HttpMethod.Get 
     }; 
      addauthheader(rq); 

      var response = await http.SendAsync(rq); 
      return response; 
     } 
    } 
private static void addauthheader(HttpRequestMessage rq) 
    { 
     MobileServiceUser user = App.client.CurrentUser; 
     rq.Headers.Add("X-ZUMO-FEATURES", "AT,QS");      
     rq.Headers.Add("X-ZUMO-INSTALLATION-ID", 
      "ff90f37e-0c03-4c52-a343-af711752e383"); 
     rq.Headers.Add("X-ZUMO-AUTH", user.MobileServiceAuthenticationToken); 
     rq.Headers.Add("Accept", "application/json"); 
     rq.Headers.Add("User-Agent", "ZUMO/2.1"); 
     rq.Headers.Add("User-Agent", 
      "(lang = Managed; os = Windows Store; os_version = --; arch = X86; version = 2.1.40707.0)"); 
     rq.Headers.Add("X-ZUMO-VERSION", 
      "ZUMO/2.1(lang = Managed; os = Windows Store; os_version = --; arch = X86; version = 2.1.40707.0)"); 
     rq.Headers.Add("ZUMO-API-VERSION", "2.0.0"); 
       } 

Sie können dies ausprobieren, da es live (und Buggy) ist.
https://gamenote2.azurewebsites.net/api/Players?displayname=Paul der Firma Goldschmidt & Mannschafts-ID = Arizona-Diamondbacks Sie sollten geben einen 404 https://gamenote2.azurewebsites.net/api/Players?displayname=Chase Utley & Mannschafts-ID = Los-Angeles-Dodgers sollten Sie Objekt eine Chase Utley geben. (Sie werden aufgefordert, sich bei einem Microsoft-Konto anzumelden).

Also meine Fragen: 1. Kann ich den mobilclient Anruf beheben, um eine Antwort anstelle einer Ausnahme zu bekommen 2. Gibt es einen guten Grund für mich, so viel Zeit damit zu verbringen.

Antwort

1

Wenn Sie die Ausnahme untersuchen, werden Sie feststellen, dass sich der Statuscode dort befindet - nur in einer Eigenschaft, die nicht serialisiert ist. Umgeben Sie einfach Ihren InvokeApiAsync() - Aufruf mit einem try/catch und testen Sie den StatusCode. Es sollte viel einfacher als das Schreiben Ihres eigenen HTTP-Client-Codes für den gleichen Zweck sein.

Speziell MobileServiceInvalidOperationException enthält die HttpResponse der fehlgeschlagenen Anfrage, so können Sie exception.Response.StatusCode Wert überprüfen.

+0

Die oben genannten Arbeiten werden in Ordnung sein, aber im Prinzip. Warum sollte ich eine Ausnahme erhalten, wenn ich nach einer httpresponse frage? Es erscheint mir als Gegenstimulator, eine Ausnahme zu bekommen. –