【问题标题】:how can I customize the name of a request [HttpGet] in c #如何在c#中自定义请求的名称[HttpGet]
【发布时间】:2020-08-22 22:55:00
【问题描述】:

我创建了以下网络服务,可以通过以下方式访问它:

https://localhost:44311/valores/1

但我想使用如下网址访问它:

https://localhost:44311/usuario/1

在网址中使用usuario

    [HttpGet("{id:int}",Name ="usuario")] 
    public ActionResult<Usuario> Get(int id)
    {
        using (var db = new prueba2Context())
        {
            var usuario = db.Usuario.Where(x => x.Id == id).FirstOrDefault();
            if (usuario == null)
            {
                return NotFound();
            }
            return Ok(usuario);
        }
    }

我是c# 的新手,如果您指出我做错了什么以及如何纠正它,我将不胜感激。

这是我的文件夹的结构。

【问题讨论】:

  • 您使用的是 ASP.NET 吗?还是 ASP.NET Core?
  • @Andy ASP.NET 核心
  • 嘎啊啊啊。这会改变响应。请注意那里有任何讨厌的东西,我在确定之前给出了答案。
  • 一,我必须删除我的答案,因为它是 asp.net-core。 2. 以后有任何关于asp.net-core(vs dot-net-framework)的问题,请用asp.net core“标记”。 (3) 我要在这里编辑标签。 (4) 从技术上讲,这是一个重复的问题:stackoverflow.com/questions/24843264/…

标签: c# entity-framework asp.net-core


【解决方案1】:

看起来您正在使用 ASP.NET Core。一个典型的端点会这样设置:

[ApiController, Route("api/[controller]")]
public class ComputationController : ControllerBase
{
    // ...

    [HttpPost, Route("beginComputation")]
    [ProducesResponseType(StatusCodes.Status202Accepted, Type = typeof(JobCreatedModel))]
    public async Task<IActionResult> BeginComputation([FromBody] JobParametersModel obj)
    {
        return Accepted(
            await _queuedBackgroundService.PostWorkItemAsync(obj).ConfigureAwait(false));
    }

    [HttpGet, Route("computationStatus/{jobId}")]
    [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(JobModel))]
    [ProducesResponseType(StatusCodes.Status404NotFound, Type = typeof(string))]
    public async Task<IActionResult> GetComputationResultAsync(string jobId)
    {
        var job = await _computationJobStatusService.GetJobAsync(jobId).ConfigureAwait(false);
        if(job != null)
        {
            return Ok(job);
        }
        return NotFound($"Job with ID `{jobId}` not found");
    }
    
    // ...
}

[ProducesResponseType] 属性用于文档框架,例如 Swagger

我总是使用[Route] 属性来定义端点路径。

在你的情况下,我会这样设置:

[HttpGet, Route("usuario/{id}")]
[ProducesResponseType(StatusCodes.Status200OK, Type = typeof(Usuario))]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public IActionResult GetUser(int id)
{
    using (var db = new prueba2Context())
    {
        var usuario = await db.Usuario.Where(x => x.Id == id).FirstOrDefault();
        if (usuario == null)
        {
            return NotFound();
        }
        return Ok(usuario);
    }
}

【讨论】:

  • @yavg -- 请查看asyncawait ...这是阻塞代码。您希望与端点尽可能异步
  • 如果它是“完美的”,那么“标记为答案”,所以这个问题不会出现在“尚未回答”SOF 查询过滤器下。
  • @andy 所以是的,好点子。但是..如果整个链可以异步等待,您希望异步。看“乌龟”谈话:docs.microsoft.com/en-us/archive/msdn-magazine/2013/march/…
  • i.imgur.com/UjIuerv.jpg(我正在按照您的建议返回此异步)但是,我不知道如何解决该问题。我正在使用实体框架并从数据库中构建我的模型
  • @yavg -- 尝试将其更改为 FirstOrDefaultAsync()
【解决方案2】:

更常用的是“路线”

这样

`[Route("usuario")]
 public ActionResult<Usuario> Get(int id)
    {
        using (var db = new prueba2Context())
        {
            var usuario = db.Usuario.Where(x => x.Id == id).FirstOrDefault();
            if (usuario == null)
            {
                return NotFound();
            }
            return Ok(usuario);
        }
    }

`

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多