将多个获取参数传递给WebApi

时间:2019-06-12 10:11:24

标签: asp.net-core-mvc asp.net-core-webapi

我正在研究一个asp.net core 2.2应用程序。我想将两个参数(令牌和刷新令牌)传递给asp.net core 2.2 Web API以检索新令牌。传递值时,出现错误

  

处理请求时发生未处理的异常。       AggregateException:发生一个或多个错误。 (响应状态代码不表示成功:404(未找到)。)       System.Threading.Tasks.Task.Wait(int毫秒超时,CancellationToken cancelToken)       HttpRequestException:响应状态代码未指示成功:404(未找到)。

这是传递多个参数并进行路由的正确方法吗?

requestUrl的构建如下:

string requestUrl = string.Format(Token_RefreshUserToken + "/{0}"+"/{1}", token,refreshToken);

requestUrl值为(Web API控制器名称为'令牌'):

"Token/Refresh/eyJhbGciOiJIQrI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InJlZnJhbmNpc0BzdXlhdpdGkuY54tIiwiZXhwIojxNTYwMzMyOTk7hCJpc3MiOiJodHRwOi8vd3d3LnNlY3WeaXR5Lm9yZyIsImF1ZCI3rdh0dHA6Ly93d3cuc2VjdXJpdHkub3JnIn0.2Iw0VS_OgMjfpgt5V27mjCuLLqzlZBgRMpYgCTEHRP88E/IDwRYkf9idsVrBhBJJ5ymS+8RrZuSBSl+wywuKCs+Bw="

客户:

Task<TokenModel> userToken = _commonHelper.RecreateUserToken(tokenModel.TokenVal, tokenModel.RefreshToken);
userToken.Wait();

public async Task<TokenModel> RecreateUserToken(string token, string refreshToken)
    {          
         string url = string.Format(WebApiConstants.Token_RefreshUserToken + "/{0}"+"/{1}", token,refreshToken);
         var statusResponse = await _ApiHelper.GetAsync(url);
         tokenData = await statusResponse.Content.ReadAsAsync<TokenModel>();
return tokenData;
     }

Web Api方法:

[HttpGet]
[Route("Refresh/{token}/{refreshToken}")]
public async Task<TokenValue> Refresh(string token, string refreshToken){   //logic     }

1 个答案:

答案 0 :(得分:0)

似乎包含double escape sequence的请求导致了问题。在开发模式下,尝试使用Kestrel而不是IIS express运行Web api项目。

ASP.NET Core应用程序可以托管在各种Web服务器(IIS,Kestrel,Nginx,Apache等)上。所有这些Web服务器都不了解请求过滤(尤其是启用双重转义),这是本机IIS的功能。这是一个托管问题,ASP.NET Core应用程序不应直接处理它。如果像http://youserver.com/Home/Phone/+12345这样的URL将到达ASP.NET Core管道,则将不以任何特殊方式处理加号,并将字符串模型视为+字符。

当您在IIS上托管应用程序时,web.config仍在使用中,因此您可以像通常的ASP.NET应用程序一样配置<requestFiltering allowDoubleEscaping="true"/>

<system.webServer>
<security>
  <requestFiltering allowDoubleEscaping="true" />
</security>

如果要在另一个Web服务器上托管应用程序,则应检查其如何处理特殊字符。 Kestrel将按原样传递此类URL,因此,如果托管在Kestrel上,则无需执行任何特定操作。

请参阅here