如何以编程方式构建服务器网址?

时间:2019-06-13 18:52:19

标签: c# .net-core asp.net-core-webapi

我不知道如何在不进行硬编码的情况下从服务器数据构建服务器URL。

例如,对于下面的类,您可以在浏览器中使用以下URL访问方法GetLoginQRCode:http://localhost:5001/api/site

在方法GetLoginQRCode中,我想构建登录方法的URL。我不知道如何获取数据来构建类似http://localhost:5001/api/site/login

的URL

显然/login可以被硬编码。但是我不想对httplocalhost或路径api/site进行硬编码。

[Route("api/[controller]")]
[ApiController]
public class SiteController : ControllerBase
{
    [HttpGet]
    public IActionResult GetLoginQRCode()
    {
        var thisServerloginUrl = "http://localhost:5001/api/dealer/login";

        /*
            what I would like is to programatically build the URL something like this
            var thisServerloginUrl = [whatever I need here] + "/login"
        */

        return Ok();
    }

    [HttpGet]
    [Route("login")]
    public IActionResult Login()
    {
        return Ok();
    }
}

有没有一种方法可以通过服务器变量获取所有这些信息,而不必进行硬编码?

编辑:我没有将用户重定向到另一个URL。我将生成一个URL为QR Code数据的QR Code。调用方法GetLoginQRode的结果将返回QR码。我不需要 Qr代码方面的帮助,因为我可以正常运行。我没有在示例中添加它来保持代码简单。

1 个答案:

答案 0 :(得分:3)

每个控制器都有一个名为Url的属性,该属性设置为IUrlHelper的实现。用它来生成一个绝对URL。该应用程序不知道自己的来源/域或协议。无法从请求中可靠地提取这些内容,因为应用程序可能位于更改标头并终止ssl的代理之后。使用配置值将协议和域添加到URL。

[HttpGet]
public IActionResult GetLoginQRCode()
{

   // In same controller
   var url = Url.Action("Login")

   // or in Different Controller
   var url = Url.Action("Login", "Account")

   return Ok();
}

api reference概述了所有可能的变体。