Azure Custom Controller / API.Net arrière-plan

j'ai eu un MobileService fonctionnant sur Azure, et 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, J'ai un travail D'authentification, et je peux faire des migrations / mise à jour-base de données. Je suis L'exemple de TodoItem. Je veux maintenant créer ma propre API personnalisée, qui a facilement fonctionné sur MobileService, mais je ne peux pas le faire fonctionner sur L'application mobile Azure: /

j'ai suivi ces deux liens web-Api-routage et app-service-mobile-backend . Et j'ai maintenant ce qui suit:

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

en outre, j'ai installé le paquet ci-dessous selon web-api-routage :

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, Content: System.Net.Http.StringContent, en-têtes: { X-ZUMO-FEATURES: AT X-ZUMO-INSTALLATION-ID: e9b359df - d15e-4119-a4ad-afe3031d8cd5 X-ZUMO-AUTH: xxxxxxxxxxx Accept: application / json User-Agent: Zumo / 2.0 User-Agent: (lang = Managed; os=Windows Store; os_version=--; arch=Neutral; version=2.0.31125.0) X-ZUMO-VERSION: zumo / 2.0 (lang= Managed; os=Windows Store; os_version=--; arch=Neutral; version=2.0.31125.0) ZUMO-API-VERSION: 2.0.0 Content-Type: application/ json; charset=utf-8 Content-Length: 3}}

Mais reçois: 404 (Non Trouvé) Message de débogage "la requête pourrait ne pas être terminé. (Non Trouvé)"

Ce qui me manque :/ ?

mise à 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 , cependant toujours pas d'accès: /

mise à Jour

j'ai utilisé fiddler2 pour accéder au point final à travers un navigateur et j'ai obtenu le résultats:

Fiddler output

Mise À Jour

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

le sentiment positif s'évapore lentement . . .

la question est également en cours d'examen sur msdn , je vais mettre à jour ici si les informations qui y figurent.


mise à Jour

Lindas testé commentaire, 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!";
    }

}

J'y accède en utilisant à la fois la fonction 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 donc pourquoi je peux y accéder utiliser des valeurs? Quelle serait la trajectoire vers le contrôleur original si le paramètre route n'était pas utilisé?


Informations Supplémentaires

j'ai maintenant créé un ticket de support avec Microsoft et vais mettre à jour avec des informations supplémentaires. . . Avec de la chance.

mise à Jour Info du forum MSDN: essayez MS_SkipVersionCheck Lire l'attribut ici , il ne semble pas applicable. Mais je l'ai essayé. Toujours Not Found pour mon API mais l'original fonctionne toujours. Donc il n'a pas d'incidence sur cette question.

30
demandé sur JTIM 2016-03-01 11:31:46

5 réponses

Oui !!!

donc j'ai finalement réussi à le faire fonctionner, j'ai copié les usings de lidydonna - msft git et j'ai lu à propos de . backend Net pour mobileservice .

se termine par ce qui suit:

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

c'est un nouveau contrôleur et pas celui qui est livré avec comme lidydonna utilisé. Il semblait vouloir les deux fonctions get et post . Cela a abouti à L'API a été enregistrée et a pu être consultée. Cela signifie que l'appel client vers le serveur que j'ai utilisé était:

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 J'AI EU UNE RÉPONSE YAY!!

Informations Supplémentaires

les controllers que vous créez, i.e. 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 . Le fait d'avoir différents intrants résout le problème.

dans le cas de weird Internal Server Error , c'est-à-dire weird, vous pouvez passer à travers tout le code du serveur toutes les variables que vous voulez retourner sont initialisées, mais le client reçoit l'erreur. Ensuite, se référer à erreur de serveur interne-Azure App Service Custom Controller où la simple correction de la configuration peut résoudre le problème.

12
répondu JTIM 2017-05-23 12:26:17

vous devez avoir quelque chose qui ne va pas 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 la route est enregistrée correctement.

essayez d'ajouter cet attribut au ValuesController et vérifiez la route.

3
répondu lindydonna - msft 2016-03-16 20:37:27

essayez de passer d'ApiController à TableController.

1
répondu viktorh 2016-03-03 11:55:23

j'ai trouvé une autre cause pour les erreurs 404 quand il est venu à 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);

La config.Maphttpattributeroutestes () doit être déplacé au-dessus de the .S'appliquer:

HttpConfiguration config = new HttpConfiguration();
 config.MapHttpAttributeRoutes();
 new MobileAppConfiguration()
        .UseDefaultConfiguration().MapApiControllers()
        .ApplyTo(config);
1
répondu mdorson 2017-06-07 03:32:14

c'est vraiment étrange mais la simple requête API ne fonctionne pas dans le service app azure J'ai donc déterminer la solution qui a fonctionné pour moi. J'ai testé les requêtes http avec C# http post/get, android post/get, et objectif c post / get Alors tout d'abord vous devez mettre à jour votre Démarrage.MobileApp.classe cs:

  new MobileAppConfiguration()
    .UseDefaultConfiguration()   
    .MapApiControllers()                /* /api endpoints **missing part***/ 
    .ApplyTo(config);

Puis créer d'Azur à l'Application Mobile Personnalisée Contrôleur . Après cela modifier un peu votre contrôleur pour obtenir JSON approprié réponse

    public class Mes
    {
        public string message { get; set; }
    }

    // GET api/My
    public Mes Get()
    {

        return new Mes { message = "thanks" };


       // return "Hello from custom controller!";
    }
    // POST api/My
    public Mes Post(Mes chal)
    {

        return new Mes { message = chal.message + "asnwer" };


        // return "Hello from custom controller!";
    }
}

vous pouvez simplement laisser la première variante et obtenir la réponse, mais L'Objectif C vous dira que le texte JSON n'a pas commencé avec le tableau ou l'objet et l'option pour autoriser les fragments...et ainsi de suite.. cela arrive parce que vous obtenez simple chaîne de caractères pas d'objet. C'est pourquoi j'ai modifié ma réponse avec class Mes Mais cela dépend aussi de la façon dont vous faites une requête et du type d'objet auquel vous vous attendez. Si. MapApiControllers() c'est la clé principale pour L'API et le contrôleur D'API WEB est maintenant changé en contrôleur personnalisé azure. Espérons que cette aide.

0
répondu Jevgenij Kononov 2017-05-09 12:32:21