首页 > 解决方案 > 如何将数据从 .net 核心 api 发送到 azure 日志分析

问题描述

我正在尝试将数据从我的 .net core API 2.1 版本发送到 Azure Log Analytics。

下面是我的代码:

    using System;
    using System.IO;
    using System.Net;
    using System.Security.Cryptography;
    using System.Text;

    namespace xyz.Common
    {
    public class AzureLogAnalytics
    {
    public String WorkspaceId { get; set; }
    public String SharedKey { get; set; }
    public String ApiVersion { get; set; }
    public String LogType { get; set; }
    public AzureLogAnalytics(String workspaceId, String sharedKey, String logType, String apiVersion = "2015-03-20")
    {
        this.WorkspaceId = workspaceId;
        this.SharedKey = sharedKey;
        this.LogType = logType;
        this.ApiVersion = apiVersion;
    }
    public void Post(string json)
    {
        string requestUriString = $"https://{WorkspaceId}.ods.opinsights.azure.com/api/logs?api-version={ApiVersion}";
        DateTime dateTime = DateTime.UtcNow;
        string dateString = dateTime.ToString("r");
        string signature = GetSignature("POST", json.Length, "application/json", dateString, "/api/logs");
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUriString);
        request.ContentType = "application/json";
        request.Method = "POST";
        request.Headers["Log-Type"] = LogType;
        request.Headers["x-ms-date"] = dateString;
        request.Headers["Authorization"] = signature;
        byte[] content = Encoding.UTF8.GetBytes(json);
        using (Stream requestStreamAsync = request.GetRequestStream())
        {
            requestStreamAsync.Write(content, 0, content.Length);
        }
        using (HttpWebResponse responseAsync = (HttpWebResponse)request.GetResponse())
        {
            if (responseAsync.StatusCode != HttpStatusCode.OK && responseAsync.StatusCode != HttpStatusCode.Accepted)
            {
                Stream responseStream = responseAsync.GetResponseStream();
                if (responseStream != null)
                {
                    using (StreamReader streamReader = new StreamReader(responseStream))
                    {
                        throw new Exception(streamReader.ReadToEnd());
                    }
                }
            }
        }
    }

    private string GetSignature(string method, int contentLength, string contentType, string date, string resource)
    {
        string message = $"{method}\n{contentLength}\n{contentType}\nx-ms-date:{date}\n{resource}";
        byte[] bytes = Encoding.UTF8.GetBytes(message);
        using (HMACSHA256 encryptor = new HMACSHA256(Convert.FromBase64String(SharedKey)))
        {
            return $"SharedKey {WorkspaceId}:{Convert.ToBase64String(encryptor.ComputeHash(bytes))}";
        }
    }

}
}

在上面的代码中同时访问

URL "$"https://{WorkspaceId}.ods.opinsights.azure.com/api/logs?api-version={ApiVersion}"; 

我收到此错误:

在此处输入图像描述

正因为如此,我无法得到回应

使用 (HttpWebResponse responseAsync = (HttpWebResponse)request.GetResponse())

标签: azureasp.net-coreazure-web-app-serviceazure-log-analytics

解决方案


授权和 API 版本存在问题。我使用的是 API 版本 2015-03-20,我已将其更改为 2016-04-01。我发现这个链接有效 - https://dejanstojanovic.net/aspnet/2018/february/send-data-to-azure-log-analytics-from-c-code/

此外,我已经浏览了多个链接。

  1. https://docs.microsoft.com/en-us/azure/azure-monitor/platform/data-collector-api

推荐阅读