Вызов HttpClient находится в режиме ожидания, но отлично работает в консольном приложении - PullRequest
0 голосов
/ 04 декабря 2018

Ниже приведен код, который прекрасно работает, когда я выполняю его в консольном приложении.Строка
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");
        }

    }

1 Ответ

0 голосов
/ 04 декабря 2018

Я полагаю, что ваша проблема на самом деле в сети

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

Никогда, никогда в асинхронном методе.Вы должны сделать это как:

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