Как настроить web api для одновременного ответа нескольких клиентов? - PullRequest
1 голос
/ 18 июня 2019

Я настраиваю новый сервер для веб-API, но когда я пытаюсь сделать почтовый запрос от двух отдельных клиентов, сервер отвечает только на первый.Со второго я всегда получаю 500 Internal Server Error.

Я пытался сделать все методы на сервере асинхронными, но произошла та же ошибка.

Я вызываю веб-службу, как показано ниже:

using(var client = new HttpClient())
{
    client.BaseAddress = new Uri("http://serverdomain/ApiName/")
    var response = client.PostAsync("controller/method", 
keyvaluepairContent);
    result = response.Result.Content.ReadAsAsync<List<string>>().Result;
}

И соответствующий сервисный код ниже:

[Route("controller/method")]
[AcceptVerbs("POST")]
public List<string> Foo([FromBody] someparams)
{
    //some logic
}

Я написал файл конфигурации как:

config.Routes.MapHttpRoute(
    name : "DefaultApi",
    routeTemplate : "{controller}/{action}/{id}",
    defaults : new { id = RouteParameter.Optinal }
);

Для одного клиента одновременноСервер работает очень хорошо.Я получаю то, что мне нужно.Однако, когда два клиента отправляют запросы даже для разных методов, задержанный всегда получает 500 внутренних ошибок.Отладчик говорит, что приведенный ниже код не может проанализировать результат, так как ответ не является списком строк, а является ошибкой выше.

result = response.Result.Content.ReadAsAsync<List<string>>().Result;

Я думаю, что мой код в порядке, но мне нужно настроить мой веб-API,Я искал об этом, но безрезультатно.

1 Ответ

0 голосов
/ 18 июня 2019

Как уже упоминалось в комментарии, вы используете HttpClient неправильно, пожалуйста, посмотрите это .

Что касается вашего WebAPI, чтобы иметь возможность отвечать на несколько вызовов asynchronously, вам нужно обернуть свой код в соответствующую сигнатуру метода следующим образом:

[Route("controller/method")]
[AcceptVerbs("POST")]
public async Task<IHttpActionResult> Foo([FromBody] someparams)
{
    //some logic
}

Некоторая ценная информация из другого ответа stackoverflow здесь

И еще один более простой ответ здесь

Как вы упомянули в своем вопросе, вы пытались сделать все методы async, но проблема в том, что вам нужно использовать Task

...