-1

下面是当我在控制台应用程序上执行它时运行良好的代码。行
var postResponse = await client.SendAsync(req); 当我在控制台应用程序中运行代码时给出结果。

但是当我在 WebApi 控制器中使用此代码时,此代码会在此行停止。

 using (var client = new HttpClient())
        {


            var auth = "MTAwNDgucnVsZXNlbmdpbmUuc2VydmljZTp2N3FuY3I4cWlz";
            client.BaseAddress = new Uri("https://federation-sts-stage.accenture.com");
            var req = new HttpRequestMessage(HttpMethod.Post, "https://federation-sts-stage.test.com/oauth/ls/connect/token");
            var cont = new FormUrlEncodedContent(bodyContents);
            cont.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            cont.Headers.ContentLength = Convert.ToInt64("125");
            req.Content = cont;
            req.Headers.Add("Authorization", "Basic " + auth);


            try
            {
                var postResponse = await client.SendAsync(req); // this is where the code keeps on waiting but works fine in console app
                postResponse.EnsureSuccessStatusCode();
                responseContents = postResponse.Content.ReadAsStringAsync().Result;


            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                return msg;
            }


            var responseObject = JObject.Parse(responseContents);
            return responseObject.Value<string>("access_token");
        }

我还比较了这两种情况下的请求对象(在控制台应用程序和 webapi 控制器调用中),但在这两种情况下,请求对象的结果都如下所示:

{Method: POST, RequestUri: 'https://federation-sts-stage.test.com/oauth/ls/connect/token', Version: 1.1, Content: System.Net.Http.FormUrlEncodedContent, Headers:
{
  Authorization: Basic MTAwNDgucnVsZXNlbmdpbmUuc2VydmljZTp2N3FuY3I4cWlz
  Content-Type: application/json
  Content-Length: 125
}}

我不知道我做错了什么。

根据评论,我将从 apicontroller 调用的整个方法如下所示,此方法在控制台应用程序中运行良好,但是当我从 apicontroller 调用此方法时,它会继续运行。

public async Task<string> RequestTokenFromIssuer(string username, string password)
    {

        var bodyContents = new Dictionary<string, string>
        {
            { "grant_type", "client_credentials" },
            { "userName", username },
            { "password", password},
            { "scope", "read_rulesengine write_rulesengine" }
        };

        string responseContents = string.Empty;

        using (var client = new HttpClient())
        {


            var auth = "MTAwNDgucnVsZXNlbmdpbmUuc2VydmljZTp2N3FuY3I4cWlz";
            client.BaseAddress = new Uri("https://federation-sts-stage.test.com");
            var req = new HttpRequestMessage(HttpMethod.Post, "https://federation-sts-stage.test.com/oauth/ls/connect/token");
            var cont = new FormUrlEncodedContent(bodyContents);
            cont.Headers.ContentType = new MediaTypeHeaderValue("application/json");
            cont.Headers.ContentLength = Convert.ToInt64("125");
            req.Content = cont;
            req.Headers.Add("Authorization", "Basic " + auth);


            try
            {
                var postResponse = await client.SendAsync(req);
                postResponse.EnsureSuccessStatusCode();
                responseContents = postResponse.Content.ReadAsStringAsync().Result;


            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                return msg;
            }


            var responseObject = JObject.Parse(responseContents);
            return responseObject.Value<string>("access_token");
        }

    }
4

1 回答 1

2

我相信你的问题实际上是在线的

responseContents = postResponse.Content.ReadAsStringAsync().Result;

永远不要在异步方法中这样做。你应该这样做:

responseContents = await postResponse.Content.ReadAsStringAsync();
于 2018-12-04T20:53:36.667 回答