Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web Api 2 OWIN Selfhost处理多个并发请求_C#_Asp.net Web Api_Asp.net Web Api2_Owin_Owin Middleware - Fatal编程技术网

C# Web Api 2 OWIN Selfhost处理多个并发请求

C# Web Api 2 OWIN Selfhost处理多个并发请求,c#,asp.net-web-api,asp.net-web-api2,owin,owin-middleware,C#,Asp.net Web Api,Asp.net Web Api2,Owin,Owin Middleware,我有一个使用OWIN的自托管web api,而且我似乎在并发连接方面遇到了困难。当我使用50个并发get事件运行压力测试时,响应时间会增加很多,即使操作非常简单,返回200 OK,并在uri中键入id 如何让我的web api OWIN和api控制器同时运行per请求 以下是我的项目示例: 创业班 public class Startup { public void Configuration(IAppBuilder appBuilder) { try

我有一个使用OWIN的自托管web api,而且我似乎在并发连接方面遇到了困难。当我使用50个并发get事件运行压力测试时,响应时间会增加很多,即使操作非常简单,返回200 OK,并在uri中键入id

如何让我的web api OWIN和api控制器同时运行per请求

以下是我的项目示例:

创业班

public class Startup
{
    public void Configuration(IAppBuilder appBuilder)
    {
        try
        {
            appBuilder.UseWelcomePage("/welcome.html");
            appBuilder.UseErrorPage(new ErrorPageOptions
            {
                ShowExceptionDetails =
    #if DEBUG
                true
    #else
                false
    #endif
            });

            Debug.WriteLine($"Setting Web Api Configuration up...");
            var apiConfig = ConfigureWebApi();
            appBuilder.UseWebApi(new HttpServer(apiConfig));
            appBuilder.UseCors(CorsOptions.AllowAll);

            Debug.WriteLine($"Completed Web Api configuration.");
        }
        catch (Exception ex)
        {
            Debug.WriteLine($"Failed to complete Web Api setup.", ex);
            throw;
        }
    }
}
控制器

public class TestController : ApiController
{
    public async Task<IHttpActionResult> Get(int id)
    {
        return Task<IHttpActionResult>.Factory.StartNew(() => {
            try
            {
                return Ok(id);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message, nameof(Get));
                return InternalServerError();
            }
        });
    }
}
公共类TestController:ApiController
{
公共异步任务Get(int-id)
{
返回Task.Factory.StartNew(()=>{
尝试
{
返回Ok(id);
}
捕获(例外情况除外)
{
WriteLine(例如Message,nameof(Get));
返回InternalServerError();
}
});
}
}
web api的我的控制台启动:

public static void Open()
{
    _webApp = WebApp.Start<Startup>(HostAddress);
    Console.WriteLine($"Host open -> {HostAddress}");
}
publicstaticvoidopen()
{
_webApp=webApp.Start(主机地址);
WriteLine($“主机打开->{HostAddress}”);
}

所有api控制器方法都将同时运行,这显然受到承载api的服务器功能的限制。这是web服务器的一项功能,无论它是IIS还是自托管的。然而,你可以做一些事情来帮助他们

如果一直保持异步,您将看到最佳性能。例如,如果控制器方法如下所示:

public async Task<IHttpActionResult> Get(int id)
{
    var testObject = await _repository.GetAsync(id);

    return Ok(testObject);
}
public async Task<TestObject> GetAsync(int id)
{
    using(var connection = new SqlConnection(_connectionString)
    {
        // using Dapper
        return await connection.QuerySingleAsync<TestObject>("sp_GetTestObject", new {Id = id}, commandType = CommandType.StoredProcedure);
    }
}
公共异步任务Get(int-id)
{
var testObject=await_repository.GetAsync(id);
返回Ok(testObject);
}
您有一个如下所示的存储库方法:

public async Task<IHttpActionResult> Get(int id)
{
    var testObject = await _repository.GetAsync(id);

    return Ok(testObject);
}
public async Task<TestObject> GetAsync(int id)
{
    using(var connection = new SqlConnection(_connectionString)
    {
        // using Dapper
        return await connection.QuerySingleAsync<TestObject>("sp_GetTestObject", new {Id = id}, commandType = CommandType.StoredProcedure);
    }
}
公共异步任务GetAsync(int-id) { 使用(var connection=newsqlconnection(_connectionString) { //衣冠楚楚 返回wait connection.QuerySingleAsync(“sp_getestObject”,new{Id=Id},commandType=commandType.StoredProcedure); } } 这样做可以让计算机使用工作线程进行数据库I/O,从而释放处理其他任务的处理能力,例如接受对API端点的其他请求。像@StephenCleary这样的人可能会详细解释和/或纠正我所说的话。@StephenCleary和他的书绝对值得一读,以了解异步编程


希望这能有所帮助。

您如何进行压力测试?您能发布代码吗?另外,您可以返回Task.FromResult(Ok(Id))而不是Factory.StartNew这不太可能阻止。但不确定这是否会导致您的问题。使用Paessler的Web服务器压力工具执行压力测试。考虑创建一个简单的客户端,然后看看它是如何运行的。感谢Task.FromResult的提示。我认为您最好创建自己的测试客户端。我不认为Paessler没有ool将正确地测试WebApi。它似乎更适用于传统的HTML网页。您使用线程只是为了返回200。这是一个性能损失。您为什么要这样做?您不需要在控制器中创建基于任务的方法。您没有做任何以这种方式受益于多线程的事情。谢谢,这当然是我所做的我一直在寻找。现在似乎运行得尽可能平稳。