web-dev-qa-db-fra.com

Backend Azure Custom Controller/API .Net

MobileService s'exécutant sur Azure, j'ai décidé de créer un nouveau service et de migrer le code moi-même. Le nouveau service est du nouveau type appelé Azure Mobile App Service.

Actuellement, l'authentification fonctionne et je peux effectuer des migrations/update-database. Je suis l'exemple TodoItem. Je souhaite maintenant créer ma propre API personnalisée, qui fonctionne facilement sur MobileService, mais je ne parviens pas à la faire fonctionner sur Azure Mobile App: /

J'ai suivi ces deux liens web-Api-routing et app-service-mobile-backend . Et j'ai maintenant le texte suivant:

J'ai créé un nouveau contrôleur:

[MobileAppController]
public class TestController : ApiController
{
    // GET api/Test
    [Route("api/Test/completeAll")]
    [HttpPost]
    public async Task<ihttpactionresult> completeAll(string info)
    {
        return Ok(info + info + info);
    }
}

Dans le mobileApp.cs j'ai ajouté le code ci-dessous selon backend :

HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();

De plus, j'ai installé le paquet ci-dessous selon web-api-routing :

Microsoft.AspNet.WebApi.WebHost 

et l'appel du client:

string t = await App.MobileService.InvokeApiAsync<string,string>("Test/completeAll", "hej");

Debug montre que c'est l'URL correcte:

{Méthode: POST, RequestUri: ' https://xxxxxxx.azurewebsites.net/api/Test/completeAll ', Version: 1.1, Contenu: System.Net.Http.StringContent, En-têtes: {X-ZUMO-FEATURES: AT X-ZUMO-INSTALLATION-ID: e9b359df-d15e-4119-a4ad-afe3031d8cd5 X-ZUMO-AUTH: xxxxxxxxxxx Accepter: application/json Utilisateur-Agent: Agent utilisateur ZUMO/2.0: (lang = Géré; os = Windows Store; version_OS = -; Arch = Neutre; version = 2.0.31125.0) X-ZUMO-VERSION: ZUMO/2.0 (lang = Géré; os = Windows Store; version_os = -; Arch = Neutre; version = 2.0.31125.0) ZUMO-API-VERSION: 2.0.0 Content-Type: application/json; charset = utf-8 Longueur du contenu: 3}}

Mais continuez à obtenir: 404 (Introuvable) Message de débogage "La requête n'a pas pu être complétée. (Introuvable)"

Qu'est-ce que je rate :/ ?

Mettre à jour

J'ai essayé d'étendre le code dans le mobileApp.cs, avec:

HttpConfiguration config = new HttpConfiguration();
        new MobileAppConfiguration()
            .UseDefaultConfiguration().MapApiControllers()
            .ApplyTo(config);
        config.MapHttpAttributeRoutes();
        app.UseWebApi(config);

basé sur app-service-backend , mais toujours pas d'accès: /

Mettre à jour

J'ai utilisé fiddler2 pour accéder au noeud final via un navigateur et j'ai obtenu les résultats suivants:

 Fiddler output

Update Again

J'ai essayé de créer une autre solution minimale, mais j'obtiens toujours la même erreur. Existe-t-il d’excellents tutoriels que je peux suivre pour réaliser cette fonctionnalité? 

Le sentiment positif s'évapore lentement. . . 

La question se pose aussi maintenant sur msdn , je mettrai à jour ici si des informations y sont affichées.


Mettre à jour

Testé Lindas commente, et je peux en fait accéder au convertisseur de valeur:

// Use the MobileAppController attribute for each ApiController you want to use  
// from your mobile clients 
[MobileAppController]
public class ValuesController : ApiController
{
    // GET api/values
    public string Get()
    {
        MobileAppSettingsDictionary settings = this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
        ITraceWriter traceWriter = this.Configuration.Services.GetTraceWriter();

        string Host = settings.HostName ?? "localhost";
        string greeting = "Hello from " + Host;

        traceWriter.Info(greeting);
        return greeting;
    }

    // POST api/values
    public string Post()
    {
        return "Hello World!";
    }

}

Je peux y accéder en utilisant à la fois les fonctions post et get:

string t = await App.MobileService.InvokeApiAsync<string, string>("values", null, HttpMethod.Post, null);

ou

string t = await App.MobileService.InvokeApiAsync<string, string>("values", null, HttpMethod.Get, null);

Mais le code que j'ai collé n'a pas de route, alors pourquoi puis-je y accéder en utilisant des valeurs? Quel serait le chemin d'accès au contrôleur d'origine si le paramètre route n'était pas utilisé?


Informations supplémentaires

J'ai maintenant créé un ticket de support avec Microsoft et le mettrai à jour avec des informations supplémentaires. . . J'espère.

Mise à jour Informations du forum MSDN: essayez MS_SkipVersionCheck La lecture de l'attribut ici ne semble pas applicable. Mais j'ai essayé. Toujours Not Found pour mon API, mais celle d'origine fonctionne toujours. Cela n’a donc pas eu d’impact sur cette question.

31
JTIM

Oui !!!

Donc, finalement, je l'ai fait fonctionner, j'ai copié les utilisations de lidydonna - msft git et lu à propos de backnet pour mobileervice .

Cela s'est terminé par:

using System.Web.Http;
using Microsoft.Azure.Mobile.Server.Config;
using System.Threading.Tasks;
using System.Web.Http.Tracing;
using Microsoft.Azure.Mobile.Server;

namespace BCMobileAppService.Controllers
{
[MobileAppController]
public class TestController : ApiController
{
    // GET api/Test
    [HttpGet, Route("api/Test/completeAll")]
    public string Get()
    {
        MobileAppSettingsDictionary settings = this.Configuration.GetMobileAppSettingsProvider().GetMobileAppSettings();
        ITraceWriter traceWriter = this.Configuration.Services.GetTraceWriter();

            string Host = settings.HostName ?? "localhost";
            string greeting = "Hello from " + Host;

            traceWriter.Info(greeting);
            return greeting;
        }

        // POST api/values
        [HttpPost, Route("api/Test/completeAll")]
        public string Post(string hej)
        {
            string retVal = "Hello World!" + hej;
            return retVal;
        }
    }
}

Il s’agit d’un nouveau contrôleur et non de celui fourni avec la lidydonna utilisée. Il semblait vouloir les deux fonctions get et post. Cela a eu pour résultat que l'API a été enregistrée et peut être consultée. Cela signifie que l'appel client au serveur que j'ai utilisé était le suivant:

t = await App.MobileService.InvokeApiAsync<string, string>("Test/completeAll", null, HttpMethod.Post, new Dictionary<string, string>() { { "hej", " AWESOME !" }});

dialog = new MessageDialog(t);
dialog.Commands.Add(new UICommand("OK"));
await dialog.ShowAsync();

ET JE SUIS UNE REPONSE YAY !!

Informations supplémentaires

Les contrôleurs que vous créez, c’est-à-dire que la classe doit se terminer par Controller, vous pouvez avoir du texte avant mais pas après. Cette information a été donnée sur un MSDN forum discussion .

Si post et get ont la même entrée, le serveur renvoie Not found. Avoir différentes entrées résout le problème.

En cas de Internal Server Error étrange, c’est bizarre, vous pouvez parcourir le code de serveur entier. Toutes les variables que vous souhaitez renvoyer sont initialisées, mais le client reçoit l’erreur. Reportez-vous ensuite à Erreur serveur interne - Contrôleur personnalisé Azure App Service où une solution simple à la configuration peut résoudre le problème.

15
JTIM

Vous devez avoir quelque chose de mal dans la configuration de votre projet. J'ai un échantillon de travail ici: https://Gist.github.com/lindydonna/6fca7f689ee72ac9cd20

Après avoir créé l'objet HttpConfiguration, appelez config.MapHttpAttributeRoutes(). J'ai ajouté l'attribut route [Route("api/Test/completeAll")] et je peux confirmer que l'itinéraire est correctement enregistré.

Essayez d’ajouter cet attribut à ValuesController et vérifiez l’itinéraire.

5
lindydonna

J'ai trouvé une autre cause aux erreurs 404 lorsqu'il est venu d'utiliser le routage d'attribut.

Le code ci-dessus avait à l'origine ceci dans mobileApp.cs:

HttpConfiguration config = new HttpConfiguration();
    new MobileAppConfiguration()
        .UseDefaultConfiguration().MapApiControllers()
        .ApplyTo(config);
    config.MapHttpAttributeRoutes();
    app.UseWebApi(config);

Le config.MapHttpAttributeRoutes () doit être déplacé au-dessus du .ApplyTo:

HttpConfiguration config = new HttpConfiguration();
 config.MapHttpAttributeRoutes();
 new MobileAppConfiguration()
        .UseDefaultConfiguration().MapApiControllers()
        .ApplyTo(config);
2
mdorson

Essayez de passer d'héritage d'ApiController à TableController.

1
viktorh