0

Username我创建了一个 API 和一个登录表单,我需要使用和属性授权对我的 API 的访问Password,这些属性是从登录表单中的两个文本框中获得的。但是,来自 API 的响应始终为空。这是我的原始代码:

    public async Task<AuthenticatedUser> Authenticate(string username, string password)
    {
        var data = new List<KeyValuePair<string, string>>()
        {
            new KeyValuePair<string, string>("grant_type", "password"),
            new KeyValuePair<string, string>("username", username), //I made sure that both username and password
            new KeyValuePair<string, string>("password", password)  //are passed correctly to the Authenticate() void
        };
        var content = new FormUrlEncodedContent(data); //var data is not null but "content" is
        using (HttpResponseMessage response = await apiClient.PostAsync("/token", content))
        {
            if (response.IsSuccessStatusCode)
            {
                var result = await response.Content.ReadAsAsync<AuthenticatedUser>(); //response is always "null"
                return result;
            }
            else
            {
                throw new Exception(response.ReasonPhrase);
            }
        }
    }

我尝试用sList<>数组替换KeyValuePair<>,我也尝试使用Dictionary<string, string>. 这些选项都不起作用。在网上进行了一些研究后,我看到了一种替代方法,StringContent或者MediaFolder但我不知道如何使它与它们一起使用。我也在我的域中使用 https,所以那里似乎没有错误。现在,它看起来好像FormUrlEncodedContent没有正确编码。

此外,来自 Swagger 和 Postman 的请求会返回值。

4

2 回答 2

1

我看到您在 Tim Corey 的 youtube 频道零售经理中完成了教程。我也有同样的PostAsync问题null

您可以在将断点设置为 line 时检查异常详细信息throw new Exception(response.ReasonPhrase);

在我的情况下,它在 DataManager 项目属性中被SSL endabled设置为True,因此它使用安全协议打开 url - https。在 Tim 的教程中,您会看到 http 协议。

  • 在 VS 解决方案资源管理器中选择 DataManager -> 属性 ->SSL Enabled: False
  • 右键单击 DataManager -> 选择 Web 选项卡 -> 将项目 url 更改为:http://...或选择覆盖应用程序根 URL:http://...
  • 检查项目中的 App.config 文件:VS 解决方案资源管理器中的 DesktopUI -> 查找标记并更改key="api" value="http://...
于 2021-03-24T09:10:41.627 回答
0

首先,password授权类型只接受表单编码application/x-www-form-urlencoded而不接受 JSON 编码application/JSON

您可以在此处阅读有关它的更多信息,并尝试按如下方式更改内容:

替换这个:

var data = new List<KeyValuePair<string, string>>()
{
     new KeyValuePair<string, string>("grant_type", "password"),
     new KeyValuePair<string, string>("username", username), //I made sure that both username and password
     new KeyValuePair<string, string>("password", password)  //are passed correctly to the Authenticate() void
};
var content = new FormUrlEncodedContent(data);

有了这个:

var content = new FormUrlEncodedContent(
    new KeyValuePair<string, string>[] {
        new KeyValuePair<string, string>("grant_type", "password"),
        new KeyValuePair<string, string>("username", username),
        new KeyValuePair<string, string>("password", password)
   }
);
于 2020-01-03T09:48:14.770 回答