2013-03-05 1 views
2

내가 웹 서비스 A를 코딩하고 나는 AI에 입력을 확인하면 웹 서비스 B.웹 서비스의 일부로 비동기 작업을 수행하는 방법은 무엇입니까?

를 호출하고있어이 반환 성공 코드와 다음 호출의 B에

방법 내가 고려하고 원하는 :

  • A가 반환 된 후 완료되는 작업자 스레드를 생성 할 수 있는지 확인합니다.
  • B를 호출하고 신뢰할 수있는 대기열을 사용하여 유효성이 검사 된 매개 변수를 전송할 에이전트 또는 서비스를 코딩합니다.

런타임 컨텍스트는 ASP.NET 웹 응용 프로그램에서 호스팅하는 Service.svc입니다.

어떻게해야합니까?

업데이트 : 대답은 모두 유용하다고 말하고 싶습니다. 나는 내가 사용한 것을 표시하기로 결정했다.

+0

몇 가지 방법으로 할 수 있습니다. 웹 서비스에 무엇을 사용하고 있습니까? WCF? 비누? 휴식? – Greg

+0

MVC 웹 사이트에서 호스팅되는 WCF 웹 서비스입니다. –

답변

2

나는 AI에 입력하면 영구적 인 큐에 작업을 배치해야합니다이 경우 B.

을 성공 코드를 반환 한 후 호출 할 확인되면 (MSMQ, 푸른 버스 등) , 그리고 나서야 성공 코드를 리턴한다. 다른 시스템 (ASP.NET에서 호스팅되지 않음, Azure 작업자 역할, Win32 서비스 등)은 대기열에서 작업을 검색하고 B를 호출해야합니다.

이것은 신뢰할 수있는 유일한 방법입니다. Phil Haack은 ASP.NET에서 두 부분을 모두 수행하는 것이 나쁜 생각 인 이유에 대해 good blog post을 가지고 있습니다. 그것은 재활용으로 이어집니다. 재활용 트리거에 대한 자세한 정보는 herehere입니다.

+0

비동기 웹 서비스 블로그 게시물에 설명 된 동일한 위험을 수행합니까? –

+0

정상적으로는 아닙니다. 기본적으로 ASP.NET은 모든 비동기 작업이 완료 될 때까지 응답을 보내지 않습니다. 따라서 요청에 대한 쓰레드가 없을 때'async' 입출력이 진행될 때까지 일정 시간이 걸릴 수 있습니다. 그러나 응답이 아직 보내지지 않았기 때문에 괜찮습니다. 응답을 보낸 후 * 작업하려고 할 때 문제가 발생합니다. IIS와 ASP.NET은이 시나리오를 위해 설계되지 않았습니다. –

2

코드 프로젝트의이 링크는 안정적인 Async Communication with Windows Communication Foundation을 만드는 데 필요한 모든 정보를 제공합니다.

통신이 양식의 처리의 많은 책 : 데 도움이되는 멀티 티어 프레임 워크

희망에서 단계

  • WCF에 의해

    • WCF 단계. 몇 가지 예를 들겠지만 코드 프로젝트의 자습서는 필요한 것을 제공해야합니다.

  • +0

    그 기사는 매우 좋아 보인다. 그래서 Begin 호출의 반환 값은 내 질문에서 언급 한 성공 코드가 될 것인가? –

    +0

    예. 나는 그렇게 믿는다. – Greg

    1

    두 번째 생각은 좋은 아이디어입니다. 비동기 부분을 Windows 서비스로 보냅니다. 안정성이 필요한 경우 메시지 대기열을 사용하여 수행하십시오. 어떤 경우이든 WCF를 사용하여 요청을 다른 서비스로 보낼 수 있습니다.

    1

    이 질문은 특정 서비스 인터페이스에만 국한된 것은 아닙니다. 일반적으로, 당신의 결정은 비동기 적으로 뭔가 호출하려는 이유에 따라 달라집니다 : 당신은 단지 클라이언트에게 단일 장기 실행 메서드 호출에 대한 빠른 응답을 제공하려면

    1. 것은, 당신의 비동기 메소드를 호출을 즉시 반환 나중에 작업 진행 상황을 확인할 때 사용할 수있는 토큰 (작업 ID 등).
    2. 장기 실행 방법이 여러 개 있고 주로 병렬 처리를 통해 효율성을 얻으려는 경우 비동기 적으로 호출하려면 먼저 &에서 수행 할 수있는 모든 작업을 이전 방법에 의존하지 않는 다른 작업으로 계속 진행하십시오. 반환 결과가 완료되거나 후속 작업을 시작하는 데 필요한 작업을 기다립니다.
    3. 이러한 상황의 대부분에서 상태 토큰을 사용하는 동기식 및 비동기식 중에서 클라이언트에게 선택권을 부여합니다. 그들이 계속하기를 원한다면 나중에 다시 확인해 볼 수 있습니다. 계속하기 전에 결과를 얻는 것이 중요하다면, 역시 옵션입니다.

    이러한 접근 방식은 각각의 후속 프레임 워크 릴리스> 3에서 더 쉽게됩니다.5, 그리고 나는 다른 답이 C#에서 비동기 작업 결과를 시작하거나 이동하거나 기다리는 방법에 대한 상세한 정보를 제공한다고 믿습니다.

    +0

    그래,이 답변은 유용했다. 나는 (1) 경우에있어 - 클라이언트는 낮은 대기 시간을 필요로하는 실시간 시스템이지만, 다른 요구 사항은 입력 검증 후 즉시 다른 웹 서비스를 호출하는 것이다. 다른 웹 서비스의 대기 시간을 제어 할 수는 없지만, 낮은 상태에 의존하고 싶지 않습니다 (실제로 유휴 상태가 된 후 첫 번째 호출에서 최대 30 초가 소요됨). –

    +0

    예, 당신은 확실히 # 1 시나리오에 있습니다. 작업을 시작하고 상태를 확인하는 데 사용할 수있는 ID를 반환하려고합니다. 아마도 두 번째 (느린) 웹 서비스 호출은 ID를 받으면 볼 수있는 무언가를 업데이트하는 것일 것입니다. 그건 꽤 고전적인 유스 케이스 다. 그래서 나는 여기에서 그것에 대해 놀리지 않을 것이다. 난 당신이 작업 상태를 저장할 키/값 캐시 일종의 있다고 가정합니다. –

    관련 문제