我正在尝试为控制器中的某些 API 构建一个超级简单的 API 密钥身份验证。为此,我有这个ConfigureServices()
:
services.AddAuthorization(options =>
{
options.AddPolicy(
Auth.Constants.WebmasterPolicyName,
policy =>
policy.RequireAssertion(context =>
{
if (context.Resource is HttpContext httpContext)
{
if (httpContext.Request.Headers.TryGetValue("X-API-KEY", out var header))
{
var val = header.FirstOrDefault()?.ToLower();
if (val == "my-super-secret-key")
{
return Task.FromResult(true);
}
}
}
return Task.FromResult(false);
})
);
});
Run Code Online (Sandbox Code Playgroud)
我用这个装饰了一个 API:
[HttpDelete("{itemId:guid}")]
[Authorize(Policy = Auth.Constants.WebmasterPolicyName)]
public async Task<ActionResult> DeleteCatalogItemAsync(Guid itemId)
Run Code Online (Sandbox Code Playgroud)
当我在请求中设置正确的 API 密钥时,效果非常好。
问题是负面情况:当密钥丢失或错误时,我会收到 500 错误:
System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can …
Run Code Online (Sandbox Code Playgroud) 我正在使用此处描述的功能标志。它工作正常,我只是想知道如果我想在内部不同的服务实现之间切换,以下是否真的是使用它们的最佳方法ConfigureServices()
?
到目前为止我有以下内容:
using Microsoft.FeatureManagement;
public void ConfigureServices(IServiceCollection services)
{
services.AddFeatureManagement();
var sp = services.BuildServiceProvider();
var featureManager = sp.GetService<IFeatureManager>();
if (featureManager.IsEnabledAsync("UseServiceB").Result)
{
services.AddHostedService<MyServiceB>();
}
else
{
services.AddHostedService<MyServiceA>();
}
}
Run Code Online (Sandbox Code Playgroud)
特别是因为IFeatureManager
只提供了一个异步方法来检查功能,这感觉不太对劲?!
我构建了一个在 kubernetes 上运行的 ASP.NET Core Worker Service(它处理队列中的消息)。由于它是后台服务,因此目前没有任何 HTTP 端点。现在我想向其中添加 k8s 的运行状况/活跃性端点 - 最好利用.NET Core 标准运行状况检查。
所以我的问题是:有没有一种方法可以公开这些运行状况检查,而无需以 k8s 可以使用它们的方式(TCP 或通用命令)增加 HTTP 端点的开销?任何指向示例的指针都会很棒!谢谢!
我正在寻找一种简洁的方法来反序列化XmlDocument
对象.我发现最接近的是这个,但我真的很想知道是否有更好的方法(在.NET 4.5甚至4.6),因为我已经有了XmlDocument.
所以目前看起来如下:
// aciResponse.Data is a XmlDocument
MyClass response;
using (XmlReader reader = XmlReader.Create((new StringReader(aciResponse.Data.InnerXml))))
{
var serializer = new XmlSerializer(typeof(MyClass));
response = (MyClass)serializer.Deserialize(reader);
}
Run Code Online (Sandbox Code Playgroud)
谢谢你有更好的主意!
我在 ASP.NET Core 3.1 中构建了一个简单的玩家跟踪 API 应用程序,该应用程序使用 Azure Cosmos DB 作为后端。
创建新玩家条目的 API 首先使用以下命令检查 Cosmos DB 中是否已存在给定分区键下具有相同 ID 的条目:
try
{
ItemResponse<Player> response = await this._playerContainer.ReadItemAsync<Player>(playerid, new PartitionKey(partitionkey));
return Conflict();
}
catch (CosmosException ex) when (ex.StatusCode == System.Net.HttpStatusCode.NotFound)
{
// There is some more logic happening here so I cannot directly just call CreateItemAsync()... and return the Conflict response that this might return.
ItemResponse<GameResult> response = await this._gameResultContainer.CreateItemAsync<GameResult>(gameresult, new PartitionKey(gameresult.PlayerId));
// ...
return Accepted();
}
Run Code Online (Sandbox Code Playgroud)
仅当此操作不返回任何内容时,我才会继续将创建请求放入后端工作队列中。否则,我将向 API 调用者返回 409-冲突。
实际插入发生在异步后端工作程序中。但我想直接返回 …
c# azure azure-application-insights asp.net-core azure-cosmosdb
*.exe是否有任何广泛接受的方法来检测它是否作为 ADO 管道的一部分运行?该脚本将作为管道的一部分和在工作站上运行,并且应该能够非常有信心地确定它在哪里运行(如果可能)。
例如。任何为此目的的预定义变量(无法找到)或其他可以检查的预定义值?
我正在从 .NET Core 应用程序查询 Cosmos DB 集合。现在我想知道,在如何向查询提供分区键方面是否有任何区别(即:以一种方式与另一种方式相比更好)?
下面region
是我的分区键。
A)
var queryString = $"SELECT TOP 100 * FROM c WHERE c.region ='{region}'";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString));
Run Code Online (Sandbox Code Playgroud)
b)
var queryString = "SELECT TOP 100 * FROM c";
var query = this.container.GetItemQueryIterator<Item>(new QueryDefinition(queryString), requestOptions: new QueryRequestOptions() { PartitionKey = new PartitionKey(region) });
Run Code Online (Sandbox Code Playgroud)
至少 RU(请求单位)看起来是相同的,所以 Cosmos DB 可能会在内部优化查询并将 a) 重写为 b),反之亦然?!
我有一个 Azure 函数,我正在尝试将 .xlsx 文件保存到临时文件夹中。我的代码在本地运行,但是当我发布到 Azure 时,我收到一条错误消息。
string projectDirectory = Directory.GetParent(Environment.CurrentDirectory).Parent.Parent.FullName + @"\temp\";
string tempFilename = "abc.xlsx";
string pathTradeRecFile = Path.Combine(projectDirectory, tempFilename);
Run Code Online (Sandbox Code Playgroud)
我的错误信息。<--- 访问路径“C:\Program Files (x86)\SiteExtensions\temp\abc.xlsx”被拒绝。
有人可以告诉我如何将此文件保存在某处吗?我在我的结构中创建了一个名为“temp”的文件夹作为一种可能的解决方案,但我似乎无法访问它。
任何帮助将不胜感激!!
ASP.NET Core 7 中的 Web API 与 System.Text.Json:
我需要拒绝 PUT/POST API 上的 JSON 有效负载,这些 API 指定了其他属性,这些属性不映射到模型中的任何属性。
所以如果我的模型是
public class Person {
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我需要拒绝任何如下所示的有效负载(带有 400-Bad Request 错误)
{
"name": "alice",
"lastname": "bob"
}
Run Code Online (Sandbox Code Playgroud)
如何才能实现这一目标?
c# ×8
asp.net-core ×5
azure ×3
azure-devops ×2
.net-4.5 ×1
.net-4.6 ×1
.net-5 ×1
.net-6.0 ×1
.net-core ×1
kubernetes ×1
powershell ×1
xml ×1