Azure 函数:将 JSON Webhook 导入到 SQL

Azure-Function: Import JSON Webhook to SQL

我正在尝试实现以下版本: http://sqlblog.com/blogs/davide_mauri/archive/2017/02/05/azure-functions-dapper-and-sql-server-json-to-store-form-data.aspx

但是我收到错误:

Exception while executing function: Functions.Incoming. System.Net.Http.Formatting: No MediaTypeFormatter is available to read an object of type 'JObject' from content with media type 'application/octet-stream'.

run.csx中的函数是:

#r "Newtonsoft.Json"

using System;
using System.Net;
using System.Net.Mail;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using Dapper;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    JObject contactFormData = await req.Content.ReadAsAsync<JObject>();

    string azureSQLConnectionString = ConfigurationManager.ConnectionStrings["sql"]?.ConnectionString;

    string payload = JsonConvert.SerializeObject(contactFormData);

    using(SqlConnection conn = new SqlConnection(azureSQLConnectionString))
    {
        conn.Execute("dbo.incomingSP", new { payload = payload }, commandType: CommandType.StoredProcedure);                
    }

    return req.CreateResponse(HttpStatusCode.OK);
}

我还有一个 project.json 文件:

    {
  "frameworks": {
    "net46":{
      "dependencies": {
        "Dapper": "1.42.0",
        "System.Data.SqlClient":"4.1.0",
        "Microsoft.WindowsAzure.ConfigurationManager":"3.2.1"
      }
    }
   }
}

而我的测试JSON代码是:

{
    "transaction": 
    {
        "IP": "7797",
        "Time": "2017-01-01"
    }
}

根据错误消息,我认为客户端将数据作为文件发送。在这种情况下,您应该以二进制形式读取请求内容,然后将其转换为字符串。由于函数本身不需要 JSON,因此您也可以跳过 deserialization/serialization 并将有效负载直接传递到 SQL:

var bytes = await req.Content.ReadAsByteArrayAsync(); 
var payload = System.Text.Encoding.Default.GetString(bytes); 
// Uncomment to trace your payload: 
// log.Info(payload); 

然后在您的 SQL 调用中使用 payload,就像您已经使用的那样。