当前位置: 首页 > 知识库问答 >
问题:

在Swagger上为. net web api调用添加自定义头字段的最佳实践是什么?

巩子实
2023-03-14

var webScope = apiDescription.ActionDescriptor.GetFilterPipeline()
   .Select(filterInfo => filterInfo.Instance)
   .OfType<WebAuthorize>()
   .SelectMany(attr => attr.Roles.Split(','))
   .Distinct();

var mobileScope = apiDescription.ActionDescriptor.GetFilterPipeline()
    .Select(filterInfo => filterInfo.Instance)
    .OfType<MobileAuthorize>()
   .SelectMany(attr => attr.Roles.Split(','))
   .Distinct();

它之所以有效,是因为我在授权 API 调用时有两种不同的方法,如您所见,我有一个移动授权和一个 Web 授权,所以我的 api 调用看起来像这样:

[HttpGet]
[Route("something")]
[WebAuthorize(Code = PermissionCode, Type =PermissionType)]
public async Task<Dto> Getsomething()
{
    return await unitOfWork.GetService<ISomething>().GetSomething();
}

使用API描述。RelativePath,我将检查相对路径是否等于我要添加的自定义标头的api调用,例如:

[HttpPost]
[Route("rename")]
[InHouseAuthorize(Code = PermissionCode, Type =PermissionType)]
public async Task<HttpResponseMessage> RenameDevice()
{
    HttpRequestMessage request = Request ?? new HttpRequestMessage();
    String deviceName = request.Headers.GetValues("deviceName").FirstOrDefault();
    String deviceGuid = request.Headers.GetValues("deviceGuid").FirstOrDefault();
    await unitOfWork.GetService<IDeviceService>().RenameDevice(deviceGuid, deviceName);
    await unitOfWork.Commit();
    return new HttpResponseMessage(HttpStatusCode.OK);
}

    if (apiDescription.RelativePath.Contains("device/rename"))
    {
        operation.parameters.Add(new Parameter
        {
            name = "deviceGuid",
            @in = "header",
            description = "Add the Device Guid",
            type = "string",
            required = false
        });
        operation.parameters.Add(new Parameter
        {
            name = "DeviceName",
            @in = "header",
            description = "Add the Device Name",
            type = "string",
            required = false
        });
    }

我正在寻找处理此问题的最佳方法。

共有1个答案

华阳秋
2023-03-14

可以将属性 [FromHeader] 用于 Web 方法参数(或 Model 类中的属性),这些参数应在自定义标头中发送。像这样:

[HttpGet]
public ActionResult Products([FromHeader(Name = "User-Identity")]string userIdentity)

对我来说,这似乎是最简单的解决方案。至少它适用于 ASP.NET Core 2.1和Swashbuckle.AspNetCore 2.5.0。

 类似资料:
  • 我正在开发一个可视化引擎(简单的CAD风格)(使用python和pyopengl绑定),可以同时显示和动画多达10-20个身体。我使用VBO数据对象来存储顶点数据并显示每个主体。我想知道为VBO分配颜色的最佳(最实用、最简单、成本更低的GPU)方法是什么。每个机身都有统一的颜色,外观可以设置为透明-可选。据我所知,这可以用以下方法完成(我测试了方法1和2): GLF(R、G、B、A) GLMATE

  • 我对拉雷维尔还不太熟悉。我有一个基本问题,在laravel中添加常量的最佳方法是什么。我知道我们用来添加常量的.env方法。我还制作了一个常量文件,用于我的项目。例如: 等等它最多可以达到100条或更多记录。那么,编写常量的最佳方法应该是什么呢。.env方法。还是添加constant.php文件? 谢啦

  • 问题内容: 我正在阅读这篇文章:http : //eviltrout.com/2013/06/15/ember-vs- angular.html 它说, 由于缺乏约定,我想知道有多少Angular项目依赖于不良行为,例如直接在控制器内进行AJAX调用?由于依赖注入,开发人员是否将路由器参数注入指令中?AngularJS新手开发人员是否会以经验丰富的AngularJS开发人员认为惯用的方式来构造代码

  • 问题内容: 在编写单元测试时,我经常遇到这样的情况,即测试中的某些对象的工作方式与实际环境中的工作方式不同。以一些接口为例。它具有和其他几个领域。逻辑上,一个配置等于s匹配时的另一个配置。但是,当谈到测试某些特定的实现时,例如,显然我想匹配 所有 字段。一种解决方案是不要在测试中使用,而只是遍历对象的属性或字段并进行比较,但这似乎不是一个好的解决方案。 因此,除了这种特定类型的情况外,我想从语义上

  • 我理解如何(以及为什么)在JSX中添加空白,但我想知道什么是最佳实践,或者是否有任何真正的区别? 将两个元素都包裹在一个跨度中 将它们添加到一行中 用JS添加空间

  • 问题内容: 我想创建辅助函数,以避免在Laravel 5的视图之间重复代码: view.blade.php 它们基本上是文本格式化功能。我在哪里以及如何使用这些功能创建文件? 问题答案: 在您的应用文件夹中创建一个文件,并使用composer加载它: 将其添加到文件后,运行以下命令: 如果您不喜欢将文件保留在目录中(因为它不是PSR-4命名空间的类文件),则可以执行网站的操作:将文件存储在boot