获取令牌时 HttpClient PostAsync returns 500

HttpClient PostAsync returns 500 when getting token

我想在阅读服务器日志之前弄清楚我能做什么(记录、检查),因为我不想在请求之前错过一些愚蠢的事情。

这是我的代码:

const string URL = "https://SomeURL/api/security/";
string urlParameters = string.Format("grant_type=password&username={0}&password={1}", username, password);
StringContent content = new StringContent(urlParameters, Encoding.UTF8, "application/x-www-form-urlencoded");

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;

HttpClient client = new HttpClient();
client.BaseAddress = new Uri(URL);
StringContent content = new StringContent(urlParameters, Encoding.UTF8, "application/x-www-form-urlencoded");

var tokenResponse = client.PostAsync("token", content).Result;

我对此比较陌生,所以我不确定接下来要检查什么,但是我已经尝试使用邮递员发出相同的请求并使用我的令牌获得响应,所以看起来我遗漏了什么或者格式不正确?

我没有 URL 对我的参数进行编码,这是解决方法(可能是更好的方法)。

string urlParameters = string.Format("grant_type=password&username={0}&password={1}", Uri.EscapeDataString(username), Uri.EscapeDataString(password));

我在上在线课程,设置URL参数的代码是这样设置的:

public async Task<AuthenticatedUser> Authenticate(string userName, string password)
    {
        var data = new FormUrlEncodedContent(new[]
        {
            new KeyValuePair<string, string>("grant_type", "password"),
            new KeyValuePair<string, string>("username ", "userName"),
            new KeyValuePair<string, string>("password", "password")
        });

        using (HttpResponseMessage response = await apiClient.PostAsync("/Token", data))
        {
            if (response.IsSuccessStatusCode)
            {
                var result = await response.Content.ReadAsAsync<AuthenticatedUser>();
                return result;
            }
            else
            {
                throw new Exception(response.ReasonPhrase);
            }
        }
    }

测试时,发现 PostAsync 调用返回 500 错误。我检查了我的 URL 地址和参数,它们看起来都是正确的。如果我在 Swagger 中测试,那么我会收到 200 状态并显示令牌。

在 Thomas Levesque 的 link 之后,我将数据变量的设置方式更改为:

var data = new FormUrlEncodedContent(new Dictionary<string, string>
        {
            ["grant_type"] = "password",
            ["username"] = username,
            ["password"] = password
        });

现在响应状态为 200,并且正确填充了 AuthenticatedUser 模型。但是我不明白为什么 Dictionary 似乎有效而 KeyValuePair 却没有。所以我创建了列表然后对其进行编码:

       var dataList = new[]
        {
            new KeyValuePair<string, string>("grant_type", "password"),
            new KeyValuePair<string, string>("username", username),
            new KeyValuePair<string, string>("password", password)
        };

        var content = new FormUrlEncodedContent(dataList);

        using (HttpResponseMessage response = await apiClient.PostAsync(requestUrl, content))

这也奏效了。我承认我不完全明白为什么.....还.