2017-10-16 41 views
-1

我正嘗試從azure函數讀取POST內容。對於發展的原因,我決定將複製Azure的門戶網站的確切樣品和我的代碼如下:無法從Azure函數讀取POST內容

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

正如你所看到的,我的目標是要閱讀這篇文章,Desserialize我的實體,稱爲「Telemetria」並保存這到一個表格到我的天藍色的存儲帳戶。 我不知道爲什麼我不能讀這行內容: string data = await request.Content.ReadAsAsync<string>();數據總是空的,我只是不知道爲什麼。 看來,因爲這是一個天藍色的函數,我不能模擬webapi的行爲。

任何幫助,歡迎。提前致謝。

+0

由於您將內容反序列化爲'string',爲什麼不直接使用Content的'ReadAsStringAsync()'方法呢? 'string data = await request.Content.ReadAsStringAsync()' –

回答

0

對於發展的原因,我決定確切的樣品從Azure的門戶網站複製

隨着Visual Studio 2017更新3(v15.3),我們可以創建預編譯天青天藍功能,我們可以對它進行調試本地更詳細的信息,我們可以參考這個blog

由於安德烈斯納瓦 - NET提到,請嘗試使用string data = await request.Content.ReadAsStringAsync(),它應該工作。