Codes DeCodes Ответов: 1

Не удается опубликовать сообщение из контроллера MVC в веб-api


Я вызываю веб-службу из контроллера MVC для публикации данных. Оба остаются в одном и том же решении.

Мой код в веб-API:

[HttpPost]
        public IHttpActionResult InsertUsers([FromBody]tblUserAgentSubAgentVMWithByte tblUserAgentSubAgentVM)
        {    return Ok("Success");    }
Мой код контроллера для вызова веб-API :
public ViewResult Register(tblUserAgentSubAgentVM tblUserAgentSubAgentVM)
        {
            using (var client = new HttpClient())
            {
                string apiHost = "http://localhost:51522";
                client.BaseAddress = new Uri(apiHost);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var json = JsonConvert.SerializeObject(tblUserAgentSubAgentVMWithByte);
                var content = new StringContent(json, Encoding.UTF8, "application/json");
                var result1 = client.PostAsync("api/Users/InsertUsers", content);
            }
        }
когда код переходит к клиенту.PostAsync("по API/пользователи/InsertUsers", контент);, я получаю сообщение "ID = 59, статус = WaitingForActivation, способ = "{нуль}", результат = "{еще не вычислено}"

Почему объект не публикуется в API?
Как я могу решить эту проблему?

Что я уже пробовал:

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

1 Ответов

Рейтинг:
8

Afzaal Ahmad Zeeshan

Ваш вопрос сам по себе имеет ответ, Ваша задача еще не оценена—Результат = "{еще не вычислен} Вам нужно дать ему больше времени, а результат проверить позже. Это время не будет известно вам, так как это неопределенное количество времени.

Это происходит потому, что в синхронном коде вам нужно дождаться выполнения задач себя Так сказать, код становится,

var json = JsonConvert.SerializeObject(tblUserAgentSubAgentVMWithByte);
var content = new StringContent(json, Encoding.UTF8, "application/json");
var result1 = client.PostAsync("api/Users/InsertUsers", content).Result;
Теперь result1 будет содержать результат запроса. Обратите внимание, что это будет блокирующий вызов, поэтому поток будет оставаться заблокированным—в состоянии ожидания—до тех пор, пока ваш запрос не будет обработан и ответ не будет захвачен.

Проблема в том, что это не тот подход, который я могу рекомендовать. Хотя вы можете смешивать синхронизацию и асинхронный код, и это полностью допустимо. Думать об этом,
// Capture asynchronously. 
var people = dbContext.GetPeople().Where(person => /* some filter */).ToListAsync();;

// Assuming, it is a small buffer of people, go sync
foreach (var person in people) {
   // Do something
}

// Save asynchronously.
dbContext.SaveAsync();
Преимущество этого заключается в том, что там, где вы знаете, что есть задержка, выполняйте задание в фоновом режиме, но в тех случаях, когда переключение контекста стоит дороже, я рекомендую вам оставаться в том же потоке, выполнять задачу и генерировать ответ.

Поэтому я рекомендую вам продолжать использовать асинхронные шаблоны и писать код асинхронным способом.
// Change the signature
public async Task<ViewResult> Register(tblUserAgentSubAgentVM tblUserAgentSubAgentVM)
{
    using (var client = new HttpClient())
    {
        string apiHost = "http://localhost:51522";
        client.BaseAddress = new Uri(apiHost);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var json = JsonConvert.SerializeObject(tblUserAgentSubAgentVMWithByte);
        var content = new StringContent(json, Encoding.UTF8, "application/json");

        // Let the runtime unwrap the task for you!
        var result1 = await client.PostAsync("api/Users/InsertUsers", content);

        // Generate and return the result
    }
}
Таким образом, теперь ваша среда выполнения будет автоматически управлять этими задачами. Так как вы используете ASP.NET, гораздо лучше и масштабируемо использовать асинхронные функции, чем привязывать запросы к потокам. Это очень дорого. Пожалуйста, не делай этого.


Codes DeCodes

Спасибо, что нашли время ответить мне таким описательным образом. Мне все стало ясно.