Я хотел воспользоваться асинхронностью в javascript, но функция просто не будет отправлять данные в API (это ВСЕГДА нулевое значение, будь то простая переменная или объект). Я часами рыскал по Интернету и перепробовал все, что мог придумать, убедился, что переменная установлена ​​​​на стороне javascript, и API всегда вызывается, однако значение равно null - это POST, но на самом деле никогда не отправляет данные .

Вот функция jQuery/javascript.

async function RetrieveProfile(userId) {
    let result;
    try {
        result = await $.ajax({
            url: '../../api/GetProfile',
            dataType: 'json',
            method: 'post',
           data: { UserId: userId }
        });
        return result;
    } catch (e) {
        console.error(e);
    }
}

Я пробовал устанавливать data: только для userId, пробовал stringify, пытался удалить dataType: 'json', пробовал с contentType и без него, без радости. Я знаю, что API работает, потому что я могу вызвать его из PostMan и получить обратно результаты (хотя это синхронно).
Согласно каждому сообщению на SO, это должно работать (у меня асинхронный javascript работал нормально много лет назад, но они всегда отправляли сообщения в ASMX вместо WebApi, поэтому должны быть какие-то другие изменения, которые необходимо внести для этого, чтобы ПОСТАВЬТЕ правильно). ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: ЭТО НЕ ЯДРО DotNet!!! Промежуточного ПО НЕТ!!!

[Route("api/GetProfile")]
[HttpPost]
public async Task<IHttpActionResult> GetProfile([FromBody] string UserId)
{
    var retval = new Profile();
    if (UserId != null)
    {
        if (await dbv.IsValidUserIdAsync(UserId))
        {
            retval = await profile_Data.GetProfileAsync(UserId);
        }
    }
    return Ok(retval);
}

Я могу пройти через javascript и посмотреть на userId, и для него установлено значение (я даже установил фиктивную переменную внутри try...catch, чтобы убедиться, что она все еще имеет значение. На стороне API UserId равен нулю. I' я пытался установить его на объект - все равно ноль. Если я удалю [FromBody], я получаю ошибку 404 (и конечная точка не попадает). Я полагаю, что либо API не распознает данные, кроме HTML DOM — игнорирование параметра ИЛИ ошибка в jQuery 3.1.1, которую я не могу обновить до 4.x или 5.x, не нарушая работу веб-сайта в других местах.

Любые идеи? Реальные рабочие примеры? Рабочие решения я могу скачать? Я использую RTFM, но не могу найти конкретный пример (jQuery 3.x + async + WebAPI 2.0 + не-DotNetCore).

0
MC9000 1 Окт 2022 в 21:23
Это о С#, но, возможно, может помочь stackoverflow. com/questions/40853188/…
 – 
GrafiCode
1 Окт 2022 в 21:42

1 ответ

Ладно - разобрался. Я был прав в том, что FromBody допускает значения (как говорится) только из тела HTML. Таким образом, данные игнорируются WebApi (им нужен [FromParam] или что-то в этом роде (оплошность со стороны MS).

Поэтому я переключил его с POST на GET как на клиенте, так и на веб-сайте.

Сторона клиента (JQuery/Javascript):

async function RetrieveProfile(userId) {
    let result;
    try {
        result = await $.ajax({
            url: '../../api/GetProfile',
            method: 'get',
           data: { UserId: userId }
        });
        return result;
    } catch (e) {
        console.error(e);
    }
}

На стороне webAPI я изменил код следующим образом:

    [Route("api/GetProfile")]
    [HttpGet]
    public async Task<IHttpActionResult> GetProfile([FromUri] string UserId)
    {
        var retval = new Profile();
        if (UserId != null)
        {
            if (await dbv.IsValidUserIdAsync(UserId))
            {
                retval = await profile_Data.GetProfileAsync(UserId);
            }
        }
        return Ok(retval);
    }

Сейчас отлично работает, но это годится только для GET, поэтому решение проблемы POST для объектов Update/Insert будет для следующего вопроса (поскольку FromBody полностью игнорирует размещенные данные: если используется асинхронный javascript - кошмар продолжается)

0
MC9000 1 Окт 2022 в 21:53
Выяснилось, что вы должны удалить атрибут FromBody при передаче объекта через POSTing или PUTing. (Я решил другую половину своей дилеммы - я хочу, чтобы MS поместил это в свои документы)
 – 
MC9000
1 Окт 2022 в 22:10