我正在研究一个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 }
答案 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