c # Асинхронный запрос curl - как получить доступ к ответу? - PullRequest
3 голосов
/ 03 июля 2019

Я пытаюсь преобразовать пример запроса curl из API для Jira в запрос C #.

Это оригинальный пример запроса Curl, который JIRA предоставляет:

curl \
   -D- \
   -u charlie:charlie \
   -X GET \
   -H "Content-Type: application/json" \
   http://localhost:8080/rest/api/2/search?jql=assignee=charlie

, который я перевел в приведенный ниже код для JIRA:

Однако строки ответа нене работает - потому что я собрал несколько примеров и немного застрял!

var myTask = curlRequestAsync(); // call your method which will return control once it hits await

string result = myTask.Result();
// .Result isn't defined - but I'm not sure how to access the response from my request!

Любая помощь будет оценена, поскольку я действительно застрял!

Полный пример:

public partial class WebForm2 : System.Web.UI.Page
{

    protected void Page_Load(object sender, EventArgs e)
    {

        var myTask = curlRequestAsync(); // call your method which will return control once it hits await

        string result = myTask.Result();
        // wait for the task to complete to continue

    }

    protected async System.Threading.Tasks.Task curlRequestAsync()
    {
        try
        {
            using (var httpClient = new HttpClient())
            {
                using (var request = new HttpRequestMessage(new HttpMethod("GET"), "http://myurl.co.uk/rest/api/2/search?jql=assignee=bob"))
                {
                    var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("username:password"));
                    request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");

                    var result = await httpClient.SendAsync(request);

                    return result;
                }
            }
        }
        catch (Exception ex)
        {
            error.InnerText = ex.Message;
        }
    }
}

Ответы [ 2 ]

4 голосов
/ 03 июля 2019

вы должны вернуть Task<System.Net.Http.HttpResponseMessage>

protected async System.Threading.Tasks.Task<HttpResponseMessage> curlRequestAsync()
{
    try
    {
        using (var httpClient = new HttpClient())
        {
            using (var request = new HttpRequestMessage(new HttpMethod("GET"), "http://myurl.co.uk/rest/api/2/search?jql=assignee=bob"))
            {
                var base64authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes("username:password"));
                request.Headers.TryAddWithoutValidation("Authorization", $"Basic {base64authorization}");

                var result = await httpClient.SendAsync(request);

                return result;
            }
        }
    }
    catch (Exception ex)
    {
         error.InnerText = ex.Message;
    }
}

, после чего вы можете получить доступ к ответу вашей задачи:

var myTask = curlRequestAsync();

var result = myTask.Result.Content.ReadAsStringAsync().Result;
2 голосов
/ 03 июля 2019

Из-за ключевого слова async подпись ваших методов, как "видимая компилятором", в области действия методов преобразуется:

protected async Task Foo()

станет

protected void Foo(); 

Чтобы вернуть значение с ключевым словом async, вы должны использовать эту подпись:

protected async Task<T> Foo()

, что приводит к

protected T Foo()

Что касается вызывающей стороны, подпись остается той же.

Вкл. Task, Result не определено, поскольку по своей природе не имеет возвращаемого значения из задачи.A Task<T> с другой стороны имеет a Result.

Итак, чтобы получить «результат», (Result не определено для Task (Wait is), вы должны использовать Task<T>, для которого определено Result.

В вашем случае вы должны изменить подпись на:

protected async System.Threading.Tasks.Task<WhatEverTypeYouAreReturning> curlRequestAsync()

Теперь вы сможетеполучите вызов Result или await, если вы находитесь в асинхронной области. Последний вариант предпочтителен, поскольку он сохранит ваш метод асинхронным, что имеет некоторые преимущества в отношении использования ресурсов.

...