【问题标题】:Getting query string variable from browser with backend server-side c#使用后端服务器端 c# 从浏览器获取查询字符串变量
【发布时间】:2020-10-05 14:30:58
【问题描述】:

我的 .NetCore 项目中有一个简单的控制器,它连接到请求授权码的第三方 API。

控制器在这里:

[HttpGet]
public IActionResult RequestAuth(string returnUrl = "/")

{
    var token = HttpContext.GetTokenAsync("AuthAccessCode");
    return Challenge(new AuthenticationProperties() { RedirectUri = returnUrl });
}

此控制器连接到第 3 方 API,然后该 API 将浏览器重定向到我指定的已定义 URL,并在查询字符串中附加授权代码,如下所示:

https://zod.es.able.edu/reports/EndPoint.htm?AuthCode=6932

现在,我需要阅读我使用 javascript 执行的 AuthCode。然后我需要对同一个 API 执行一个 POST 事件以获取一个非常长的安全令牌。

但是 3rd-party API 的制造商说它必须从我的服务器完成,而不是客户端浏览器端。如果我在客户端执行 POST 请求,就像在 Javascript 中一样,他们会拒绝该请求。请求必须来自我的后端 (c#) 服务器。

这就是我要挂断电话的地方。因为我知道如何在客户端使用 Ajax 或类似的东西。

但是服务器后端代码(c#)如何检索 AuthCode,然后向 API 发出 POST 请求?

我什至不知道从哪里开始?

有这样的库吗?

谢谢!

【问题讨论】:

  • @insane_developer 谢谢!我通读了一遍,发现我可以使用 HttpMethod.Post 进行 POST。但是,它如何处理知道何时以及如何获取 AuthCode 查询字符串变量?现在,我正在使用 Javascript 来获取查询字符串,但需要它的是服务器,而不是客户端。谢谢!

标签: c# asp.net-core asp.net-core-mvc asp.net-core-3.1


【解决方案1】:

您将要研究 C# 中的 HTTP 请求。您可以查看此资源以获取更多信息:

https://www.google.com/search?q=httprequests+in+.net+c%23&rlz=1C1CHBF_enCA849CA849&oq=httprequests+in+.net+c%23&aqs=chrome..69i57j0l5.3386j0j1&sourceid=chrome&ie=UTF-8

http://zetcode.com/csharp/httpclient/

谷歌搜索“在 .net 核心中发出 API 请求”也会很有帮助。

至于在控制器中获取查询字符串,您可以使用当前 HttpContext 中的请求对象来实现。

var queryStringCollection= Request.Query;

var queryStringCollection = HttpContext.Request.Query;

这将返回所有查询字符串值的集合,或者您可以使用:

var queryString = Request.QueryString;

var queryString = HttpContext.Request.QueryString;

这将返回原始查询字符串。

可以在这里获取更多信息:

https://forums.asp.net/t/1441380.aspx?how+to+get+query+string+in+Controller+

【讨论】:

  • 谢谢!服务器端 C# 代码如何“知道”API 将浏览器重定向到包含 queryString 的 URL?我的意思是,每当浏览器点击 URL 时,我如何使用 IHttpClientFactory 触发 POST 请求?还是那不可能?
  • 对于进行 3rd 方身份验证重定向,流程通常如下所示:用户单击一个链接,其 href 值设置为您希望他们重定向的 url,在身份验证发生后,您会收到一个“回调”(请求) 发送到您已经设置的操作,您可以使用 HttpClient 从 API 获取身份验证令牌。
  • 嗨,诺兰,是的!这就说得通了!因为用户确实单击了网页上的按钮。该按钮单击,触发到第 3 方 API,然后加载另一个网页,这是指定的重定向。这个新 URL 包含 AuthCode 值。然后我需要在查询字符串中使用该 AuthCode 值对 API 进行服务器端 POST 调用(然后返回所需的令牌值)。
  • 正确,当重定向发生时,它将到达控制器中的端点。您可以为该代码设置一个参数,该参数被传回或从 Request.Query(或 Request.QueryString)中获取。此时,您创建一个 http 请求并使用该代码将其发送到 API。您将获得该请求的结果(其中将包含令牌),然后您可以使用该令牌稍后为该用户发出请求。
  • 是的,您通常在您的帐户上为 3rd 方 API 设置的重定向 URL。此 url 将是控制器中某些操作的 url。前任。 localhost:5000/Test/Callback
【解决方案2】:

在这里,您可以使用 .net core HttpClient 从服务器端代码发出请求。 这是官方文档

HttpClient

这是一个小示例代码:-

        public HttpClient client = new HttpClient();
        var postData= JsonConvert.SerializeObject(data);
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));//ACCEPT header
        var request = new StringContent(postData, Encoding.UTF8, "application/json");//CONTENT-TYPE header
        var res = await client.PostAsync(yourUrl, request );
        var finalResult = res.Content.ReadAsStringAsync().Result;

【讨论】:

  • 以这种方式声明一个 HttpClient 会导致一些问题。使用 IHttpClientFactory 重用客户端是最佳实践。在 HttpClient 文档中,它说明了问题并提供了使用静态客户端的解决方案。
猜你喜欢
  • 2017-11-25
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 2021-03-23
相关资源
最近更新 更多