2017-05-16 11 views
2

OWIN을 사용하여 자체 호스트 된 웹 API를 가지고 있으며, 동시 연결에 어려움을 겪고있는 것 같습니다. 50 개의 동시 발생 이벤트로 스트레스 테스트를 실행하면 응답 시간이 많이 늘어나고 심지어 조작이 간단하더라도 uri에 입력 한 ID로 200 OK를 반환합니다.Web Api 2 OWIN 셀프 호스트가 여러 개의 동시 요청을 처리합니다.

어떻게 내 웹 API OWIN 및 api 컨트롤러가 동시 요청을 실행할 수 있습니까 ?? 당신의 API의 모든

public static void Open() 
{ 
    _webApp = WebApp.Start<Startup>(HostAddress); 
    Console.WriteLine($"Host open -> {HostAddress}"); 
} 
+0

스트레스 테스트를 어떻게합니까? 그 코드를 게시 할 수 있습니까? – MichaelDotKnox

+0

또한 Factory.StartNew를 수행하는 대신 차단 가능성이 적은 Task.FromResult (Ok (Id))를 반환 할 수 있습니다. 그게 당신의 문제를 일으킬 지 확실하지 않은 경우. – MichaelDotKnox

+0

Paessler 's Webserver Stress 도구를 사용하여 스트레스 테스트 수행. 단순한 클라이언트를 대신 작성하고 어떻게 진행되는지 생각해보십시오. Task.FromResult 팁을 주셔서 감사합니다. – grmihel

답변

1

:

시작 클래스

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(); 
      } 
     }); 
    } 
} 

웹 API를 내 콘솔 시작 : 여기

내 프로젝트의 샘플입니다 범죄자 troller 메소드는 동시에 실행되며, API를 호스팅하는 서버의 기능에 의해 제한됩니다. 이것은 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); 
    } 
} 

이 컴퓨터는 데이터베이스 I에 대한 작업자 스레드를 사용할 수 있습니다 수행/O를 사용하여 API 엔드 포인트에 대한 다른 요청을 승인하는 것과 같은 다른 태스크를 처리하기위한 처리 능력을 확보 할 수 있습니다. @StephenCleary와 같은 누군가는 아마도 내가 말하거나 수정 한 것에 대해 설명 할 수 있습니다. @ StephenCleary의 blog과 도서는 확실히 비동기 프로그래밍을 이해하는 데 가치가 있습니다.

희망이 있습니다.

+0

고마워, 그게 excatly 내가 뭘 찾고 있었는지. 가능한 한 매끄럽게 실행됩니다. – grmihel