azure - 如何将数据从 .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())
解决方案
授权和 API 版本存在问题。我使用的是 API 版本 2015-03-20,我已将其更改为 2016-04-01。我发现这个链接有效 - https://dejanstojanovic.net/aspnet/2018/february/send-data-to-azure-log-analytics-from-c-code/
此外,我已经浏览了多个链接。
推荐阅读
- javascript - 仅允许自动完成字段中下拉列表中的选定值
- reactjs - 获取方法相互依赖
- java - 正则表达式提取方括号内外的字符串
- c - 如何将线程连接到管道并将该信息检索到另一个线程?
- python - BeautifulSoup4 查找所有非嵌套匹配项
- java - 如果不是所有线程都在给定的父线程超时内完成,java需要停止所有子线程
- python - Python使用另一个表中的键和值来处理数据表?
- azure - Azure PS 查询以获取特定于给定资源组注册的资源提供程序
- python - 为什么 int() 的基值限制在 36 到 2 之间
- python-3.x - pyinstaller --onefile 不会复制必要的文件