swagger 如何修复“无法将约束引用'string'解析为类型”?

vfh0ocws  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(130)

我知道这个问题有几个帖子有多个答案,但在我的情况下,我还没有找到解决方案。

    • 我正在用NET 8构建Web API。*
    • 我的网络API已经 Swagger *
    • 我正在使用依赖注入,服务层,UnityOfWork和Repository模式。*
    • 我现在不用CORS *

因此,获取数据的堆栈跟踪模式看起来像这样:
第一个月
在我的例子中,我只有3个控制器执行简单的CRUD操作
在每堂课上,我都有这样的东西:

[Produces("application/json")]
[Route("api/[controller]/[action]")]
[ApiController]
public class UsersController : ControllerBase
{     
    private readonly IUserService _userService;     
    private readonly IUserTypeService _userTypeService;     
    private readonly IMapper _mapper;     

    /*Constructor with injections*/
    public UsersController(IUserService userService, 
                           IUserTypeService userTypeService, 
                           IMapper mapper) 
    {     
        _userService = userService;     
        _mapper = mapper;     
        _userTypeService = userTypeService; 
    }

    [HttpPost] 
    public IActionResult TestAction([FromBody] UserRegisterDto registeredUserDto) 
    {     
          /*---Some code snippet here ---*/
    }
}

字符串
Swagger按预期显示我的控制器和端点x1c 0d1x
但不管我执行什么操作,它都会为所有操作抛出相同的错误;其中一些是HttpGet,HttpPost,HttpPatch等。

正文请求:

  • 注意:所有属性都是后端类(UserRegisterDto.cs)中的字符串类型 *
{   
  "username": "string",   
  "name": "string",   
  "password": "string",   
  "role": "string" 
}


这是错误抛出.

这是我的Program.cs文件

using Microsoft.AspNetCore.Builder; 
using Microsoft.AspNetCore.Hosting; 
using Microsoft.Extensions.Configuration; 
using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Hosting; 
using System; using System.Reflection; 
using Sat.Recruitment.Infrastructure.Extensions; 
using Microsoft.AspNetCore.Mvc;  

var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddOptions(builder.Configuration); 
    builder.Services.AddDbContexts(builder.Configuration);          
    builder.Services.AddServices(builder.Configuration); 
    builder.Services.AddSingleton(builder.Configuration); builder.Services.AddSwagger($"    
                                {Assembly.GetExecutingAssembly().GetName().Name}.xml"); 
    
    builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());    
    builder.Services.AddControllers(options => {        
            options.CacheProfiles.Add("Default30seconds", new CacheProfile { Duration = 30 
            }); }).AddNewtonsoftJson();  

var app = builder.Build();  // Configure the HTTP request pipeline. 

if (app.Environment.IsDevelopment()) 
{     
    app.UseDeveloperExceptionPage();     
    app.UseSwagger();     
    app.UseSwaggerUI(); 
}  

app.UseHttpsRedirection();   
app.UseRouting(); 
app.UseAuthentication(); 
app.UseAuthorization();  
app.UseEndpoints(endpoints => { _ = endpoints.MapControllers(); });  
app.Run();


我不知道我到底需要修复什么。我已经检查了我的依赖项,似乎一切正常。我在UserController构造函数中有一个断点,但请求没有到达。

配置文件(Program.cs文件中服务的扩展方式)

x 1c 3d 1x

有人知道发生了什么吗?
谢谢你,谢谢

shyt4zoc

shyt4zoc1#

在asp net中没有叫做string的约束。但是,如果你想控制id参数的外观,请考虑以下几点:
1-如果ID必须是前缀,则可以使用{id:guid}
2-如果ID必须是整数,可以使用{id:int}
3-如果您希望任何参数只接受字母(a到z字符),请使用{id:alpha}
4-如果以上都不匹配,可以使用正则表达式来确保id格式的正确性,如{regex: *your reqular expression*}

rdlzhqv9

rdlzhqv92#

未能将约束引用“string”解析为类型
此错误通常是由于使用约束时引用不确定而导致的。我复制了与您相同的错误,您可以将其用作引用。当我的工艺路线模板配置了字符串类型约束时,会出现此错误:

[Route("api/[controller]/[action]")]
    [ApiController]
    public class UController : Controller
    {

   [HttpGet("{id:string}")]
   public IActionResult GetById(string id)
   {

       return Ok($"User with ID {id}");
   }   
    }

字符串
x1c 0d1x和相同的错误将报告在我的其他方法:

[Produces("application/json")]
[Route("api/[controller]/[action]")]
[ApiController]
public class UsersController : Controller
{
      
    [HttpPost]
    public IActionResult TestAction([FromBody] UserRegisterDto registeredUserDto)
    {
       
        return Ok(registeredUserDto);
    }
}


当我删除字符串时:

[Route("api/[controller]/[action]")]
  [ApiController]
  public class UController : Controller
  {
      [HttpGet("{id}")]
      public IActionResult GetById(string id)
      {

          return Ok($"User with ID {id}");
      }

  }


所有方法恢复正常:

x 1c 3d 1x
在ASP.NET Core中,默认情况下路由参数的类型为string。因此,使用{parameter:string}不是有效的路由约束,因为默认类型已经是string。如果在其他控制器和方法中使用string类型约束,则可能会发生冲突。若要解决此问题,可以检查是否有其他控制器和方法配置了不正确的约束。如果存在此类约束,则可以考虑删除它们或使用alpha配置更具体的约束。有关路由约束的具体信息,请参阅以下文档:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-7.0#route-constraints

相关问题