操作需要扬鞭独特方法/路径组合

问题描述 投票:1回答:2

我有相同的控制器2 HTTP GET方法,并给我这个错误

HTTP方法 “GET” &路径 “API /数据存储” 通过操作过载 - DPK.HostApi.Controllers.DataStoreController.GetByIdAsync(DPK.HostApi),DPK.HostApi.Controllers.DataStoreController.GetAllAsync(DPK.HostApi)。操作需要扬鞭2.0独特方法/路径组合。

我的控制器:

[Route("api/[controller]")]
[ApiController]
public class DataStoreController : ApiControllerBase
{
    private readonly IDataStoreService _dataStoreService;

    public DataStoreController(IDataStoreService dataStoreService)
    {
        _dataStoreService = dataStoreService;
    }


    [HttpPost]
    public async Task<IActionResult> PostAsync([FromBody] DataStoreCommand dataStoreCommand)
    {
        try
        {
            if (ModelState.IsValid)
            {
                await _dataStoreService.PostAsync(dataStoreCommand);
                return Ok();
            }

            var errorList = ModelState.Values.SelectMany(m => m.Errors).Select(e => e.ErrorMessage).ToList();
            return ValidationProblem();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }


    [HttpPut]
    public async Task<IActionResult> PutAsync([FromBody] DataStoreCommand dataStoreCommand)
    {
        try
        {
            if (ModelState.IsValid)
            {
                await _dataStoreService.PutAsync(dataStoreCommand);
                return Ok();
            }

            var errorList = ModelState.Values.SelectMany(m => m.Errors).Select(e => e.ErrorMessage).ToList();
            return ValidationProblem();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }


    [HttpDelete]
    public async Task<IActionResult> DeleteAsync(int id)
    {
        try
        {
            if (ModelState.IsValid)
            {
                var item = await _dataStoreService.GetByIdAsync(id);
                await _dataStoreService.DeleteAsync(item);
                return Ok();
            }

            var errorList = ModelState.Values.SelectMany(m => m.Errors).Select(e => e.ErrorMessage).ToList();
            return ValidationProblem();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }


    [HttpGet]
    public async Task<DataStoreQuery> GetByIdAsync(int id)
    {
        try
        {
            return await _dataStoreService.GetByIdAsync(id);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }





    [HttpGet]
    public async Task<IEnumerable<DataStoreQuery>> GetAllAsync(string instanceName, string dbname, string userName, string userPass, bool isActive, DateTime? startCreatedDate, DateTime? endCreatedDate, DateTime? startModifiedDate, DateTime? endModifiedDate)
    {
        object[] parameters = { instanceName, dbname, userName, userPass, isActive, startCreatedDate, endCreatedDate, startModifiedDate,  endModifiedDate};
        var parameterName = "@instanceName , @dbname , @userName , @userPass , @isActive , @startCreatedDate , @endCreatedDate , @startModifiedDate , @endModifiedDate";
        try
        {
            return await _dataStoreService.ExecWithStoreProcedure(parameterName, parameters);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
            throw;
        }
    }




}

我的启动:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info
            {
                Version = "v1",
                Title = " ",
                Description = " ",
                TermsOfService = "None",
                Contact = new Contact() { Name = " ", Email = " ", Url = " " }
            });
        });
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseMvc();


        app.UseSwagger();
        app.UseSwaggerUI(c =>
        {
            c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
        });
    }
}
c# asp.net-core swagger asp.net-core-webapi swagger-ui
2个回答
1
投票

你需要映射到id HttpGet

[HttpGet("{id}")]
public async Task<DataStoreQuery> GetByIdAsync(int id)
{
    try
    {
        return await _dataStoreService.GetByIdAsync(id);
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        throw;
    }
}

当你通过不提供模板指定HTTPGET,Swashbuckle尝试使用默认的地图对他们俩的。因此发生冲突。


0
投票

可以按如下方式解决这个问题:

services.AddSwaggerGen (c =>
  {
    other configs;
    c.ResolveConflictingActions (apiDescriptions => apiDescriptions.First ());
  });
//in the Startup.cs class in the ConfigureServices method

或者你可以把路由区分你的方法,例如:

[HttpGet("~/getsomething")]
[HttpGet("~/getothersomething")]
© www.soinside.com 2019 - 2024. All rights reserved.