标签: asp.net-core-webapi

适用于Kestrel .NET Core Web API的适当的Kubernetes准备和活动探测器

我们的目标是使用Kubernetes横向扩展.NET Core 2.0 Web API.Web API应用程序将由Kestrel提供.

看起来我们可以通过配置Kestrel的关闭超时来优雅地处理pod的终止,所以现在我们正在研究如何探测应用程序以确定准备和活跃度.

仅使用HTTP请求探测Web API是否足够?如果是这样,创建一个新的健康检查控制器以处理这些探测请求是一个好主意,还是探测在正常使用中消耗的实际端点更有意义?

在区分活跃度和准备度探测时,我们应该考虑什么?

kubernetes kestrel-http-server asp.net-core asp.net-core-webapi

17
推荐指数
2
解决办法
907
查看次数

ASP.net Core API中的路由

我在Asp.net核心中阅读了很多关于API的路径的主题,但我无法使其工作.

首先,这是我的控制器:

Public class BXLogsController : Controller
{
    //[HttpGet("api/[controller]/ID/{id}", Name = "GetL")]
    public IActionResult GetById(string id)
    {
        if (id.Trim() == "")
            return BadRequest();
        else
        {
            Logs l = AccessBase.AccBase.GetLog(id);
            return Json(l);
        }
    }

    //[HttpGet("api/[controller]/API/{apiname}", Name = "GetLAPI")]
    public IActionResult GetByAPI(string apiname)
    {
        if (apiname.Trim() == "")
            return BadRequest();
        else
        {
            List<Logs> lstLogs = AccessBase.AccBase.GetLogsApi(apiname);
            return Json(lstLogs);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用HttpGetAttribute带路径(请参阅注释),但这不起作用.

所以我想使用MapRoute方法,但这也不起作用.

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "LogsId",
        template: "api/[controller]/ID/{id}",
        defaults: new { controller = "BXLogs", action …
Run Code Online (Sandbox Code Playgroud)

c# .net-core asp.net-core asp.net-core-webapi asp.net-core-routing

16
推荐指数
1
解决办法
3万
查看次数

.NET Core RuntimeIdentifier与TargetFramework

有人可以在csproj文件(VS2017)中解释这两个的目的:

<TargetFramework>netstandard1.6</TargetFramework>
<RuntimeIdentifier>win7</RuntimeIdentifier>
Run Code Online (Sandbox Code Playgroud)

我刚从VS2015迁移,现在无法发布我的web api,因为它看起来我应该只使用一个目标框架.另外我不能指定多个RID.所有这些改变的事情让我感到沮丧.没有什么可以从头开始,应该一遍又一遍地克服一些东西.

我只想在Windows上开发我的web-api,在这里运行xUnit测试,然后部署web-api以在linux(ubuntu)服务器上运行.我应该在csproj的两个参数中加入什么?非常感谢与良好解释的链接.

UPDATE1

我有web api和引用的.net核心库.从VS2015迁移的所有东西.现在我有根项目 <TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>.当我通过VS2017发布时出现错误:

C:\ Program Files\dotnet\sdk\1.0.3\Sdks\Microsoft.NET.Sdk\buildCrossTargeting\Microsoft.NET.Sdk.targets(31,5):错误:如果未指定"发布"目标,则不支持目标框架.当前项目针对多个框架,请指定已发布应用程序的框架.

但我在发布时指定了目标框架 netcoreapp1.1.好.然后我<PropertyGroup Condition="$(TargetFramework)'=='netcoreapp1.1'"> <RuntimeIdentifier>ubuntu.16.10-x64</RuntimeIdentifier> </PropertyGroup>按照下面的建议更新了我的csproj .但是现在我甚至无法构建app,得到错误:

5> C:\ Program Files(x86)\ Microsoft Visual Studio\2017\Enterprise\MSBuild\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.targets(92,5):错误:资产文件'\ obj\project.assets.json'没有'.NETCoreApp,Version = v1.1/ubuntu.16.10-x64'的目标.确保已为TargetFramework ='netcoreapp1.1'和RuntimeIdentifier ='ubuntu.16.10-x64'恢复此项目.

我只想在Windows 8.1/windows7上使用VS2017进行开发并部署到ubuntu 16.10.我做错了什么?

UPDATE2

我有8个项目正在解决.其中3个是xUnit测试.因此我们有5个项目.这5个中的4个是类库,1个是我的web-app.所有4个类库都有:

<TargetFrameworks>netstandard1.6;net461</TargetFrameworks>    
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

我的网络应用:

<TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <Reference Include="System" />
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

如何发布我的网络应用程序?

.net-core asp.net-core asp.net-core-webapi visual-studio-2017 runtime-identifier

16
推荐指数
2
解决办法
2万
查看次数

在JWT中更新/更改角色声明(或任何其他声明)

我将用户角色存储在JWT中(以限制API端点).管理员可以更改角色.

如果角色发生了变化.我怎么能在所有代币中反映这一点?我考虑过几个解决方案:

  • 如果我使用刷新令牌,则用户必须等到访问令牌的到期日期到期.

  • 我可以记录已更改的用户ID并检查每个请求,然后在用户更改后返回新令牌.

有没有标准的方法来做到这一点?

authentication oauth jwt asp.net-core asp.net-core-webapi

16
推荐指数
2
解决办法
4978
查看次数

如何将Web API控制器添加到现有的ASP.NET Core MVC?

我使用默认的ASP.NET Core MVC模板创建了一个项目.我想在下面创建一个RESTful API /api/{Controller}.我添加了一个新的Web API控制器(标准Web API控制器类模板),但我无法调用它.我收到一条错误消息,指出无法找到该页面.我尝试在Startup.cs中添加一个路由,但它没有做任何事情:

app.UseMvc(routes =>
{
    routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
    routes.MapRoute(name: "api", template: "api/{controller=Admin}");
});
Run Code Online (Sandbox Code Playgroud)

编辑:

就像我说的,这都是默认模板.这是我添加的Web API控制器:

[Route("api/[controller]")]
public class AdminController : Controller
{                
    // GET api/values/5
    [HttpGet("{id}")]
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    [HttpPost]
    public void Post([FromBody]string value)
    {
    }

    // PUT api/values/5
    [HttpPut("{id}")]
    public void Put(int id, [FromBody]string value)
    {
    }

    // DELETE api/values/5
    [HttpDelete("{id}")]
    public void Delete(int id)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

c# asp.net-core-mvc asp.net-core asp.net-core-webapi asp.net-core-routing

16
推荐指数
4
解决办法
7867
查看次数

如何在无视图 Web API 中配置防伪保护

我正在使用 ASP.NET Core 实现 REST API。除了使用 cookie 进行身份验证之外,它是无状态的,因此容易受到跨站点请求伪造 (CSRF) 攻击。

幸运的是,ASP.NET Core 提供了一种保护措施:防止ASP.NET Core 中的跨站点请求伪造 (XSRF/CSRF) 攻击

由于我的应用程序没有任何视图或页面,我只是services.AddControllers()在我的Startup.

当点击归因于 的 REST 端点时[ValidateAntiForgeryToken],我收到以下异常:

System.InvalidOperationException: 没有注册“Microsoft.AspNetCore.Mvc.ViewFeatures.Filters.ValidateAntiforgeryTokenAuthorizationFilter”类型的服务。

使用注册我的控制器services.AddControllersWithViews()会使这个错误消失,因为它在内部注册了适当的服务。

根据文档

当在 Startup.ConfigureServices 中调用以下 API 之一时,防伪中间件被添加到依赖注入容器中:

添加MVC

MapRazorPages

地图控制器路由

MapBlazorHub

所有这些方法在我看来都是以视图为中心的(除了MapControllerRouteConfigure在我的方法中做的Startup但它没有帮助),并且缺少服务的一部分命名空间是ViewFeatures. 这让我感到困惑,因为在我的理解中,尽管我正在开发一个没有视图的纯 Web API,但需要处理 CSRF。

我的理解有误吗?不涉及视图时如何配置CSRF保护?

csrf asp.net-core asp.net-core-webapi

16
推荐指数
1
解决办法
655
查看次数

ASP.NET Core 6.0 Web API 错误状态:400 标题:“发生一个或多个验证错误。” 对于由于外键而导致的 POST 请求

我一直在开发一个使用 .NET 6.0 和 SQL 的项目,并且遇到了状态:400 标题:“发生一个或多个验证错误”。每当我尝试对治疗表发出 POST 请求时,都会出现错误,如下所示(使用 Swagger)。

400 - Undocumented
Error: response status is 400

Response body
Download
{
  "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
  "title": "One or more validation errors occurred.",
  "status": 400,
  "traceId": "00-471d5fa9b5bd60df0f6dddef0dcd44ad-4ed5f5f29428b83e-00",
  "errors": {
    "TblPet": [
      "The TblPet field is required."
    ],
    "Procedure": [
      "The Procedure field is required."
    ]
  }
}
Response headers
 content-type: application/problem+json; charset=utf-8 
 date: Thu,14 Jul 2022 11:25:42 GMT 
 server: Kestrel 
Run Code Online (Sandbox Code Playgroud)

该项目遵循此 ERD:

在此输入图像描述

该 API 是使用 Visual Studio 2022 构建的,它创建了许多public virtual项目,这些项目很可能是已设置的所有外键的结果。因此,我的 …

c# sql asp.net-core-webapi asp.net-core-6.0

16
推荐指数
1
解决办法
2万
查看次数

更新 Microsoft Graph 后未找到 DelegateAuthenticationProvider

我有以下代码(从 Microsoft Learn 复制),在 Microsoft.Graph 4.54.0 上运行良好

var authProvider = new DelegateAuthenticationProvider(async (request) => {
                // Use Microsoft.Identity.Client to retrieve token
                var assertion = new UserAssertion(token.AccessToken);
                var result = await clientApplication.AcquireTokenOnBehalfOf(scopes, assertion).ExecuteAsync();

                request.Headers.Authorization =
                    new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", result.AccessToken);
            });
Run Code Online (Sandbox Code Playgroud)

然后,我使用 Microsoft.Graph 5.0.0 和 Microsoft.Graph.Core 3.0.0 创建了一个新项目,这给出了无法找到 DelegateAuthenticationProvider 的错误。

如何创建可与 GraphServiceClient 一起使用的 AuthenticationProvider?

c# oauth-2.0 azure-ad-msal asp.net-core-webapi microsoft-graph-api

16
推荐指数
3
解决办法
2万
查看次数

ASP.NET核心中间件将参数传递给控制器

我正在使用ASP.NET Core Web API,我有多个独立的web api项目.在执行任何控制器的操作之前,我必须检查登录用户是否已经模仿其他用户(我可以从中获取DB)并且可以将模拟用户传递Idactions.

由于这是一段可以重复使用的代码,我想我可以使用中间件:

  • 我可以从请求标头获取初始用户登录
  • 获取被授权的用户ID(如果有)
  • 在请求管道中注入该ID,使其可用于被调用的api
public class GetImpersonatorMiddleware
{
    private readonly RequestDelegate _next;
    private IImpersonatorRepo _repo { get; set; }

    public GetImpersonatorMiddleware(RequestDelegate next, IImpersonatorRepo imperRepo)
    {
        _next = next;
        _repo = imperRepo;
    }
    public async Task Invoke(HttpContext context)
    {
        //get user id from identity Token
        var userId = 1;

        int impersonatedUserID = _repo.GetImpesonator(userId);

        //how to pass the impersonatedUserID so it can be picked up from controllers
        if (impersonatedUserID …
Run Code Online (Sandbox Code Playgroud)

c# middleware asp.net-core-mvc asp.net-core asp.net-core-webapi

15
推荐指数
2
解决办法
5872
查看次数

ASP.NET Core中外部类库的本地化

我有两个项目:

  • MyWebApp - ASP.NET核心Web API
  • MyServices - .NET Core类库,包含上述项目的有用服务

如何IStringLocalizerMyServices中添加本地化?.resx文件必须在哪里?

c# dll .net-core asp.net-core asp.net-core-webapi

15
推荐指数
3
解决办法
5410
查看次数