Лучшая практика для создания HTTP-сообщения из asp. net Page_Load? - PullRequest
1 голос
/ 03 августа 2020

Кажется, что это простая задача, но в сети много разных подходов к этому, так что лучше всего сделать простой HTTP POST из asp. net Page_Load (я нахожусь. net 4.7 )?

Многие ресурсы указывают на то, что HttpClient.PostAsyn c является наиболее легким подходом.

Однако приведенный здесь пример: https://docs.microsoft.com/en-us/aspnet/web-forms/overview/performance-and-caching/using-asynchronous-methods-in-aspnet-45 - использует WebClient.

Кроме того, оба этих подхода требуют установки Page Async = "true" на странице - я вижу противоречивую информацию о том, действительно ли это правильный подход.

Контекст: Моя страница похоже, что он проводит много времени в BLOCKED_TIME во время двух запросов, сделанных в Page_Load.

введите описание изображения здесь

Я подозреваю, что это связано с тем, как я в настоящее время делаю POST:

public string makePost(string parametersToPassOn, string command)
{
    HttpContent c = new StringContent(parametersToPassOn, Encoding.UTF8, "application/json");
    var t = Task.Run(() => fireRESTcall(new Uri(walletProxyURL + command), c));
    t.Wait();

    return t.Result;
}

static async Task<String> fireRESTcall(Uri u, HttpContent c)
{
    var response = string.Empty;
    using (var client = new HttpClient())
    {
        HttpRequestMessage request = new HttpRequestMessage
        {
            Method = HttpMethod.Post,
            RequestUri = u,
            Content = c
        };

        HttpResponseMessage result = await client.SendAsync(request);
        if (result.IsSuccessStatusCode)
        {
            response = await result.Content.ReadAsStringAsync();
        }
    }
    return response;
}

Любая помощь / мысли будут очень благодарны.

1 Ответ

1 голос
/ 03 августа 2020

Пока ваша страница отправляет исходящий HTTP-запрос, она не может делать ничего полезного, кроме ожидания ответа. См. Также Общие сведения о BLOCKED_TIME в PerfView

Вероятно, вы ничего не можете сделать с этой задержкой, так как вам нужен внешний API для некоторых данных, и вам нужно дождаться его завершения, чтобы чтобы сделать что-нибудь полезное с этими данными.

Поэтому рекомендуется использовать async / await полностью, используя RegisterAsyncTask():

void Page_Load()
{
    RegisterAsyncTask(new PageAsyncTask(CallApiAsync));
    Page.ExecuteRegisteredAsyncTasks();
}

async Task CallApiAsync() // calls
async Task<string> MakePost() // calls
async Task<String> FireRESTcall()

поток для обработки нового входящего запроса, пока исходящий запрос не будет завершен и входящий запрос не будет продолжен в том же или другом потоке пула потоков.

Чтобы это работало с WebForms, вам нужно Async="true" на вашей странице .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...