An error occurred Send Events: Azure Function Outp

2019-08-21 18:57发布

问题:

I have an Azure IoT Dev Kit MXChip and I am sending the sensor data to the IoT Hub. I have also set up the Stream Analytics Job with Input as IoT Hub and Output as SQL Server and Azure Function. The output is getting written to the SQL Database, so I am confirming that the Query is correct.

When I check my stream analytics job log, I am seeing some error as below.

{
    "channels": "Operation",
    "correlationId": "4a9c9b61-631a-4f4f-a403-c2869b2af66c",
    "description": "",
    "eventDataId": "97250faf-fa47-4e78-9981-8429f293bab9",
    "eventName": {
        "value": "streamingNode0",
        "localizedValue": "streamingNode0"
    },
    "category": {
        "value": "Administrative",
        "localizedValue": "Administrative"
    },
    "eventTimestamp": "2018-12-18T15:54:22.9777487Z",
    "id": "",
    "level": "Error",
    "operationId": "a613bc6a-5f61-4064-bea5-83c3af232e68",
    "operationName": {
        "value": "Send Events: Azure Function Output Adapter failed to write events",
        "localizedValue": "Send Events: Azure Function Output Adapter failed to write events"
    },
    "resourceGroupName": "mlIoTPlatformDev",
    "resourceProviderName": {
        "value": "Microsoft.StreamAnalytics",
        "localizedValue": "Microsoft.StreamAnalytics"
    },
    "resourceType": {
        "value": "Microsoft.StreamAnalytics/streamingjobs",
        "localizedValue": "Microsoft.StreamAnalytics/streamingjobs"
    },
    "resourceId": "",
    "status": {
        "value": "Failed",
        "localizedValue": "Failed"
    },
    "subStatus": {
        "value": "",
        "localizedValue": ""
    },
    "submissionTimestamp": "2018-12-18T15:55:04.0799116Z",
    "subscriptionId": "",
    "properties": {
        "Message Time": "2018-12-18 15:54:22Z",
        "Error": "- An error occurred while sending the request.\r\n- The underlying connection was closed: An unexpected error occurred on a send.\r\n- Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.\r\n- An existing connection was forcibly closed by the remote host\r\n",
        "Message": "Failed to write events. Error encountered after writing [0] batches., - An error occurred while sending the request.\r\n- The underlying connection was closed: An unexpected error occurred on a send.\r\n- Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.\r\n- An existing connection was forcibly closed by the remote host\r\n, : OutputSourceAlias:AzureFunctionOutput;AdapterType:AzureFunction;ShardId:0;",
        "Type": "AzureFunctionOutputAdapterFailure",
        "Correlation ID": "4a9c9b61-631a-4f4f-a403-c2869b2af66c"
    },
    "relatedEvents": []
}

Below is my Azure Function code.

[FunctionName("GetData")]
public static async Task < HttpResponseMessage > Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req,
    // [SignalR(HubName = "ml-iot-platform")] IAsyncCollector<SignalRMessage> signalRMessages,
    ILogger log) {
    log.LogInformation($ "GetData function triggered with Uri {req.RequestUri}");
    dynamic data = await req.Content.ReadAsAsync < object > ();
    log.LogInformation($ "Data count is {data.Count}");

    if (data.ToString().Length > 262144) {
        return new HttpResponseMessage(HttpStatusCode.RequestEntityTooLarge);
    }

    //await signalRMessages.AddAsync(new SignalRMessage()
    //{
    //   Target = "checkData",
    //   Arguments = new object[] { data }
    //});

    return req.CreateResponse(HttpStatusCode.OK, "Success");
}

Have you ever faced this issue?

回答1:

I think I figured it out, I changed my Azure Function code as follows.

[FunctionName("GetData")]
public static async Task < HttpResponseMessage > Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestMessage req,
    ILogger log) {
    log.LogInformation($ "GetData function triggered with Uri {req.RequestUri}");

    string content = await req.Content.ReadAsStringAsync();
    log.LogInformation($ "String content is {content}");
    dynamic data = JsonConvert.DeserializeObject(content);

    log.LogInformation($ "Data count is {data?.Count}");

    if (data ? .ToString() ? .Length > 262144) {
        return new HttpResponseMessage(HttpStatusCode.RequestEntityTooLarge);
    }

    return req.CreateResponse(HttpStatusCode.OK, "Success");
}

When I monitor my Azure function, I could see that I was getting an error as "No MediaTypeFormatter is available to read an object of type 'Object' from content with media type 'application/octet-stream'.", so I get the data as string and deserialized the same.

Apart from that, I also set the TLS version of my function to 1.0, this is very important, Microsoft is giving the warning to change but not an error.

Now the function is working fine without any errors, from the monitor option. You can also see the documentation here.