0
votes

I want to make an Azure Function that takes a JSON body passed to it and inserts this document in to an Azure COSMOSDB instance.

To do so, I created this function in the Azure Functions Portal: Azure Function configuration

And implement the function like so:

#r "Newtonsoft.Json"
using Newtonsoft.Json.Linq;

using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, object outputDocument)
{
    var requestContent = await req.Content.ReadAsStringAsync();
    log.Verbose($@"Received request:\n{requestContent}");

    var newDoc = JObject.Parse(requestContent);
    newDoc["Id"] = Guid.NewGuid().ToString();
    newDoc["shardKey"] = newDoc.Value<string>(@"Id").Substring(8);

    outputDocument = newDoc;

    return req.CreateResponse(System.Net.HttpStatusCode.Created);
}

In the portal, I put in an easy sample doc:

{
  "prop1": 2,
  "prop2": "2017-02-20",
}

and click 'Run'

I'm immediately met with portal IDE error

as an overlay in the portal IDE along with

{
  "id": "145ee924-f824-4064-8364-f96dc12ab138",
  "requestId": "5a27c287-2c91-40f5-be52-6a79c7c86bc2",
  "statusCode": 500,
  "errorCode": 0,
  "message": "'UploadDocumentToCosmos' can't be invoked from Azure WebJobs SDK. Is it missing Azure WebJobs SDK attributes?"
}

in the log area.

There seems to be nothing I can do to fix the issue, yet I sure feel like I'm doing everything right.

What do I need to do to simply take a JSON object as an HTTP Request to an Azure Function, and insert/upsert said object in to an Azure Cosmos DB instance??

2

2 Answers

1
votes

For async functions you should use IAsyncCollector:

public static async Task<HttpResponseMessage> Run(
    HttpRequestMessage req, TraceWriter log, 
    IAsyncCollector<object> outputDocuments)
{
    ...
    await outputDocuments.AddAsync(newDoc);
}
-2
votes

Can you try adding out to dynamic outputDocument?

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log, out dynamic outputDocument)