【问题标题】:How to configure web api to respond multiple client at the same time?如何配置 web api 同时响应多个客户端?
【发布时间】:2019-10-31 18:21:04
【问题描述】:

我正在为 web 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 Internal Error。调试器说下面这段代码无法解析结果,那是因为响应不是字符串列表而是上面的错误。

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

我认为我的代码很好,但我需要配置我的 web api。我确实搜索了它,但没有结果。

【问题讨论】:

标签: c# post webserver


【解决方案1】:

正如评论中首先提到的,您使用HttpClient错误请查看this

至于您的 WebAPI 能够响应多个调用 asynchronously 您需要将代码包装在适当的方法签名中,如下所示:

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

来自另一个stackoverflow回答here的一些有价值的信息

还有一个更简单的答案here

就像您在问题中提到的那样,您尝试使用所有方法 async 但问题是您需要使用 Task

【讨论】:

  • 在异步任务中封装方法与服务器返回的内部服务器错误无关。它基本上只是让传入的线程空闲,以便它可以处理后续请求。默认线程池有 20 个线程,所以这不是第二个请求返回 Internal Server Error 的原因。
  • 是的,可能是别的东西,但他在问你是怎么做到的,所以我觉得我提供了足够的信息让他弄清楚.. 我们会看到他什么时候回复
  • 谢谢约翰克里斯。我应用了您的建议,但遇到了同样的错误。不幸的是,由于某些业务规则,无法查看服务器日志,无法访问服务服务器。在我的 PC 中,远程访问被禁用,因此只有我的客户端可以同时向本地 Web 服务发出请求,这是完美的工作。我正在尝试找到一种获取错误并可以查看日志的方法。两者不能同时进行:(
  • 对于您使用 HttpClient 的建议,我认为它不会导致此问题,但我相信它会改善性能。我会在找到解决方案后立即尝试。谢谢你。 :)
猜你喜欢
  • 2020-12-16
  • 2020-01-18
  • 2018-07-21
  • 2020-10-17
  • 2017-04-04
  • 1970-01-01
  • 2017-03-02
  • 2012-04-13
  • 2020-11-16
相关资源
最近更新 更多