2017-10-16 3 views
-1

J'essaie de lire le contenu POST à ​​partir de la fonction azur. Pour développer des raisons que je décide de copier l'échantillon exact de Portal Azure et mon code est le suivant:Impossible de lire le contenu POST à ​​partir de la fonction Azure

using System; 
using System.Linq; 
using System.Net; 
using System.Net.Http; 
using System.Web.Http; 
using System.Threading.Tasks; 
using Microsoft.Azure.WebJobs.Host; 
using Microsoft.WindowsAzure.Storage; // Namespace for CloudStorageAccount 
using Microsoft.WindowsAzure.Storage.Table; // Namespace for Table storage types 
using System.Configuration; 
using Newtonsoft.Json; 
using System.IO; 

namespace UnioAzureFunctions.Controllers 
{ 
    [RoutePrefix("api/telemetria")] 
    public class TelemetriaController : ApiController 
    {  

    [AllowAnonymous]   
    [HttpPost] 
    public async Task<HttpResponseMessage> Run(HttpRequestMessage request, TraceWriter log) 
    { 
     try 
     { 
      // parse query parameter 
      string name = request.GetQueryNameValuePairs() 
       .FirstOrDefault(q => string.Compare(q.Key, "name", true) == 0) 
       .Value; 

      // Get request body 
      string data = await request.Content.ReadAsAsync<string>(); 

      var telemetria = JsonConvert.DeserializeObject<Telemetria>(data); 
      // Set name to query string or body data 
      // name = name ?? data?.name; 

      //TODO: Usar CloudCOnfigurationManager ou ConfigurationManager normal * 
      //// Parse the connection string and return a reference to the storage account. 
      //CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
      // CloudConfigurationManager.GetSetting("StorageConnectionString")); 

      #region conexão com cloud table storage 
      CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
       ConfigurationManager.AppSettings["StorageConnectionString"]); 

      // Create the table client. 
      CloudTableClient tableClient = storageAccount.CreateCloudTableClient(); 

      // Retrieve a reference to the table. 
      CloudTable table = tableClient.GetTableReference("telemetria"); 

      // Create the table if it doesn't exist. 
      table.CreateIfNotExists(); 


      // Create the TableOperation object that inserts the customer entity. 
      TableOperation insertOperation = TableOperation.Insert(telemetria); 

      // Execute the insert operation. 
      table.Execute(insertOperation); 


      #endregion 

      return name == null 
       ? request.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body") 
       : request.CreateResponse(HttpStatusCode.OK, "Hello " + name); 
     } 
     catch (Exception ex) 
     { 

      throw ex; 
     } 
    } 

} 

public class Telemetria : TableEntity 
{ 
    public Telemetria(string carteira, string crm, string app, 
     long idTenant, long idUsuario, string operadora, string action, DateTime dataHora) 
    { 
     Carteira = carteira; 
     Crm = crm; 
     App = app; 
     IdTenant = IdTenant; 
     IdUsuario = IdUsuario; 
     Operadora = operadora; 
     Action = action; 
     DataHora = dataHora; 
    } 

    public Telemetria()//não retirar - necessário para funcionar o tableEntity 
    { 

    } 
    public string Carteira { get; set; } 
    public string Crm { get; set; } 
    public string App { get; set; } 
    public long IdTenant { get; set; } 
    public long IdUsuario { get; set; } 
    public string Operadora { get; set; } 

    public string Action { get; set; } 
    public DateTime DataHora { get; set; } 
    } 
} 

Comme vous pouvez le voir, mon but est de lire ce message et Desserialize à mon entité appelée « Telemetria » et sauver ceci à une table dans mon compte de stockage d'azur. Je ne sais pas pourquoi je ne peux pas lire le contenu de cette ligne: string data = await request.Content.ReadAsAsync<string>(); les données sont toujours nulles et je ne sais pas pourquoi. Il semble que, puisqu'il s'agit d'une fonction azurée, je ne peux pas simuler le comportement en tant que webapi.

Toute aide est la bienvenue. Merci d'avance.

+0

Puisque vous désérialisez le contenu en tant que chaîne, pourquoi ne pas simplement utiliser la méthode ReadAsStringAsync() 'du contenu? 'chaîne de données = wait request.Content.ReadAsStringAsync()' –

Répondre

0

Pour développer des raisons que je décide de copier l'échantillon exact de Portal Azure

Avec Visual Studio 2017 Update 3 (v15.3), nous pourrions créer la précompilé fonction d'azur Azure et nous pourrions le débugger localement, plus d'informations détaillées, nous pourrions faire référence à ce blog. Comme Andrés Nava - .NET mentionné que s'il vous plaît essayez d'utiliser string data = await request.Content.ReadAsStringAsync(), cela devrait fonctionner.