tutorial porta notification microsoft management hub c# asp.net azure azure-api-apps azure-mobile-services

c# - notification - porta azure



Controlador personalizado de Azure/API.Net backend (5)

He tenido un MobileService ejecutándose en Azure, y he decidido crear un nuevo servicio y migrar el código yo mismo. El nuevo servicio es del nuevo tipo llamado: Azure Mobile App Service.

Actualmente tengo la autenticación funcionando, y puedo hacer migraciones / actualizar-base de datos. Estoy siguiendo el ejemplo de TodoItem. Ahora quiero crear mi propia API personalizada, que funcionó fácilmente en MobileService, pero no puedo hacer que funcione en Azure Mobile App: /

He seguido estos dos enlaces web-Api-routing y app-service-mobile-backend . Y ahora tengo lo siguiente:

Creé un nuevo controlador:

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

En mobile.pp.cs he agregado el siguiente código de acuerdo con el app-service-mobile-backend - app-service-mobile-backend :

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

Además, he instalado el siguiente paquete según web-Api-routing :

Microsoft.AspNet.WebApi.WebHost

y la llamada del cliente:

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

La depuración muestra que es la URL correcta:

{Método: POST, RequestUri: '' https://xxxxxxx.azurewebsites.net/api/Test/completeAll '', Versión: 1.1, Contenido: System.Net.Http.StringContent, Encabezados: {X-ZUMO-CARACTERÍSTICAS: AT X -ZUMO-INSTALLATION-ID: e9b359df-d15e-4119-a4ad-afe3031d8cd5 X-ZUMO-AUTH: xxxxxxxxxxx Aceptar: application / json User-Agent: ZUMO / 2.0 User-Agent: (lang = Administrado; os = Windows Store; os_version = -; arch = Neutral; version = 2.0.31125.0) X-ZUMO-VERSION: ZUMO / 2.0 (lang = Administrado; 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}}

Pero siga recibiendo: 404 (No encontrado) Mensaje de depuración "No se pudo completar la solicitud. (No se encontró)"

Qué me estoy perdiendo :/ ?

Actualizar

He intentado expandir el código en The mobileApp.cs, con:

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

basado en el app-service-mobile-backend , sin embargo, todavía no hay acceso: /

Actualizar

Utilicé fiddler2 para acceder al punto final a través de un navegador y obtuve los siguientes resultados:

Actualizar nuevamente

Intenté crear otra solución mínima, pero aún recibo el mismo error. ¿Hay algún tutorial excelente que pueda seguir para lograr esta funcionalidad?

La sensación positiva se está evaporando lentamente. . .

La pregunta también se está ejecutando ahora en msdn , actualizaré aquí si se muestra alguna información allí.

Actualizar

Probado Lindas comenta, y de hecho puedo acceder al convertidor de valor:

// 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!"; } }

A esto accedo utilizando tanto la función de publicación como la de obtención:

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

o

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

Pero el código que pegué no tiene ninguna ruta, ¿por qué puedo acceder a él usando valores? ¿Cuál sería la ruta del controlador original si no usara el parámetro de ruta?

Información extra

Ahora he creado un ticket de soporte con Microsoft y lo actualizaré con información adicional. . . Ojalá.

Actualizar información del foro de MSDN: pruebe MS_SkipVersionCheck Leyendo sobre el atributo here , no parece aplicable. Pero lo intenté. Todavía Not Found para mi API, pero el original todavía está funcionando. Entonces no tuvo un impacto en este tema.


¡Sí!

Así que finalmente lo puse en funcionamiento, copié los usos de lidydonna - msft git y leí sobre .net backend para servicio móvil .

Esto terminó con lo siguiente:

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

Este es un nuevo controlador y no el que viene con él como lo utilizó lidydonna. Parecía que quiere que ambas funciones se get y post . Como resultado, la API se registró y se puede acceder a ella. Esto significa que la llamada del cliente al servidor que utilicé fue:

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

Y YO TENGO UNA RESPUESTA, ¡SI!

Información extra

Los controladores que usted crea, es decir, la clase necesita terminar con el Controller , puede tener texto antes pero no después. Esta información se proporcionó en una discusión del foro de MSDN .

Si la post y la get tienen la misma entrada, el servidor devuelve Not found . Tener diferentes entradas resuelve el problema.

En caso de Internal Server Error extraño del Internal Server Error , es decir, raro que pueda recorrer el código del servidor completo, todas las variables que desea devolver se inicializan, pero el cliente recibe el error. A continuación, consulte Error interno del servidor - Controlador personalizado del servicio de aplicaciones Azure, donde una solución simple a la configuración puede resolver el problema.


Debe tener algo mal en la configuración de su proyecto. Tengo una muestra de trabajo aquí: git

Después de crear el objeto HttpConfiguration , llame a config.MapHttpAttributeRoutes() . Agregué el atributo de ruta [Route("api/Test/completeAll")] y puedo confirmar que la ruta está registrada correctamente.

Intente agregar este atributo al ValuesController y verifique la ruta.


Encontré otra causa para los errores 404 a la hora de usar el enrutamiento de atributos.

El código anterior originalmente tenía esto en mobileApp.cs:

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

El config.MapHttpAttributeRoutes () debe moverse por encima de .ApplyTo:

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


Es realmente extraño, pero la solicitud de API sencilla no funciona en el servicio de aplicaciones azure Así que he descubierto una solución que me ha funcionado. He probado las solicitudes http con c # http post / get, post / get de android y objetivo C post / get Entonces, antes que nada, necesitas actualizar tu clase Startup.MobileApp.cs:

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

A continuación, cree el controlador personalizado de Azure Mobile App . Después de eso, modifique un poco su controlador para obtener la respuesta json adecuada

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

Puedes dejar la primera variante y obtener una respuesta, pero OBjective C te dirá que el texto JSON no comenzó con una matriz u objeto y una opción para permitir fragmentos ... y así sucesivamente ... Esto sucede porque obtienes una cadena simple y no un objeto. Entonces, es por eso que modifiqué mi respuesta con la clase Mes. Pero también depende de cómo haga la solicitud y qué tipo de objeto espera. Así que .MapApiControllers () es la clave principal para la API y el controlador de la API WEB ahora se ha cambiado a un controlador personalizado azure. Espero que esto ayude.


Intenta cambiar la herencia de ApiController a TableController.