다음을 통해 공유


서비스 엔드포인트 및 큐 주소 지정

이 항목에서는 클라이언트가 큐에서 읽은 서비스를 처리하는 방법과 서비스 엔드포인트가 큐에 매핑되는 방법에 대해 설명합니다. 다음 그림에서는 클래식 WCF(Windows Communication Foundation) 대기열 애플리케이션 배포를 보여 줍니다.

큐에 대기된 애플리케이션 다이어그램

클라이언트가 서비스에 메시지를 보내려면 클라이언트가 대상 큐에 메시지를 주소 지정합니다. 서비스에서 큐에서 메시지를 읽으려면 수신 대기 주소를 대상 큐로 설정합니다. WCF의 주소 지정은 URI(Uniform Resource Identifier) 기반이지만 MSMQ(메시지 큐) 큐 이름은 URI 기반이 아닙니다. 따라서 WCF를 사용하여 MSMQ에서 만든 큐를 처리하는 방법을 이해해야 합니다.

MSMQ 주소 지정

MSMQ는 경로 및 형식 이름을 사용하여 큐를 식별합니다. 경로는 호스트 이름과 QueueName를 지정합니다. 필요에 따라 호스트 이름과 Private$ 그리고 Active Directory 디렉터리 서비스에 게시되지 않은 프라이빗 큐를 나타내는 QueueName 사이에 있을 수 있습니다.

경로 이름은 라우팅 및 큐 관리자 전송 프로토콜을 포함하여 주소의 추가 측면을 결정하기 위해 "FormatNames"에 매핑됩니다. Queue Manager는 네이티브 MSMQ 프로토콜과 SOAP SRMP(Reliable Messaging Protocol)의 두 가지 전송 프로토콜을 지원합니다.

MSMQ 경로 및 형식 이름에 대한 자세한 내용은 메시지 큐 정보를 참조하세요.

NetMsmqBinding 및 서비스 주소 설정

서비스에 메시지를 처리할 때 통신에 사용되는 전송에 따라 URI의 체계가 선택됩니다. WCF의 각 전송에는 고유한 체계가 있습니다. 이 체계는 통신에 사용되는 전송의 특성을 반영해야 합니다. 예를 들어 net.tcp, net.pipe, HTTP 등이 있습니다.

WCF의 MSMQ 큐 전송은 net.msmq 체계를 노출합니다. net.msmq 체계를 사용하여 주소가 지정된 모든 메시지는 MSMQ 큐 전송 채널을 통해 전송 NetMsmqBinding 됩니다.

WCF에서 큐의 주소 지정은 다음 패턴을 기반으로 합니다.

net.msmq: // <host-name> / [private/] <queue-name>

위치:

  • < host-name> 는 대상 큐를 호스트하는 컴퓨터의 이름입니다.

  • [private]은 선택 사항입니다. 프라이빗 큐인 대상 큐의 주소를 지정할 때 사용됩니다. 공용 큐를 처리하려면 프라이빗을 지정해서는 안 됩니다. MSMQ 경로와 달리 WCF URI 형식에는 "$"가 없습니다.

  • < queue-name> 는 큐의 이름입니다. 큐 이름은 하위 큐를 참조할 수도 있습니다. 따라서 <queue-name> = <name-of-queue>[;sub-queue-name].

예제1: 컴퓨터 abc.adatum.com에 호스트된 개인 큐인 PurchaseOrders에 접근하기 위해 URI는 net.msmq://abc.adatum.com/private/PurchaseOrders가 됩니다.

예제2: 컴퓨터 def.adatum.com에서 호스팅되는 공용 큐 AccountsPayable을 해결하기 위해 URI는 net.msmq://def.adatum.com/AccountsPayable입니다.

큐 주소는 리스너가 메시지를 읽기 위해 사용하는 리슨 URI입니다. 즉, 큐 주소는 TCP 소켓의 수신 대기 포트와 동일합니다.

큐에서 읽는 엔드포인트는 ServiceHost를 열 때 이전에 지정한 것과 동일한 체계를 사용하여 큐의 주소를 지정해야 합니다. 예제는 Net MSMQ 바인딩을 참조하세요.

여러 계약의 큐

큐의 메시지는 서로 다른 계약을 구현할 수 있습니다. 이 경우, 모든 메시지를 성공적으로 읽고 처리하기 위해서는 다음 조건 중 하나가 참이어야 합니다.

  • 모든 계약을 구현하는 서비스에 대한 엔드포인트를 지정합니다. 권장되는 방법입니다.

  • 서로 다른 계약을 가진 여러 엔드포인트를 지정하지만 모든 엔드포인트가 동일한 NetMsmqBinding 개체를 사용하는지 확인합니다. ServiceModel의 디스패치 논리는 디스패치를 위해 전송 채널에서 메시지를 읽는 메시지 펌프를 사용하며, 결국 계약에 따라 메시지를 다른 엔드포인트로 디플렉싱합니다. 리스닝 URI/바인딩 쌍에 대한 메시지 펌프가 만들어집니다. 큐 주소는 대기 중인 수신기에 의해 수신 대기 URI로 사용됩니다. 모든 엔드포인트가 동일한 바인딩 개체를 사용하게 하면 단일 메시지 펌프를 사용하여 계약을 기반으로 메시지를 읽고 관련 엔드포인트에 대한 멀티플렉스를 해제할 수 있습니다.

SRMP 메시징

앞에서 설명한 대로 큐 간 전송에 SRMP 프로토콜을 사용할 수 있습니다. HTTP 전송이 전송 큐와 대상 큐 간에 메시지를 전송할 때 일반적으로 사용됩니다.

SRMP 전송 프로토콜을 사용하려면 앞에서 설명한 대로 net.msmq URI 체계를 사용하여 메시지를 주소 지정하고 속성에 QueueTransferProtocol SRMP 또는 보안 SRMP를 NetMsmqBinding선택합니다.

속성을 지정하는 QueueTransferProtocol 것은 보내기 전용 기능입니다. 이는 어떤 종류의 큐 전송 프로토콜을 사용할지 클라이언트가 표시한 것입니다.

Active Directory 사용

MSMQ는 Active Directory 통합을 지원합니다. ACTIVE Directory 통합을 사용하여 MSMQ를 설치하는 경우 컴퓨터는 Windows 도메인의 일부여야 합니다. Active Directory는 검색을 위해 큐를 게시하는 데 사용됩니다. 이러한 큐를 공용 큐라고 합니다. 큐 주소를 지정할 때 Active Directory를 사용하여 큐를 확인할 수 있습니다. 이는 DNS(도메인 이름 시스템)를 사용하여 네트워크 이름의 IP 주소를 확인하는 방법과 유사합니다. UseActiveDirectory 속성은 NetMsmqBinding 대기 중인 채널이 Active Directory를 사용하여 큐 URI를 확인해야 하는지 여부를 나타내는 부울입니다. 기본적으로 .로 설정됩니다 false. 속성이 UseActiveDirectory 설정된 true경우 대기 중인 채널은 Active Directory를 사용하여 net.msmq:// URI를 형식 이름으로 변환합니다.

UseActiveDirectory 속성은 메시지를 보낼 때 큐의 주소를 확인하는 데 사용되므로 메시지를 보내는 클라이언트에만 의미가 있습니다.

net.msmq URI를 메시지 큐 형식 이름에 매핑

큐에 대기된 채널은 채널에 제공된 net.msmq URI 이름을 MSMQ 형식 이름에 매핑하는 작업을 처리합니다. 다음 표에서는 이들 간에 매핑하는 데 사용되는 규칙을 요약합니다.

WCF URI 기반 큐 주소 Active Directory 속성 사용 큐 전송 프로토콜 속성 결과의 MSMQ 형식 이름
Net.msmq://<machine-name>/private/abc False(기본값) 네이티브(기본값) DIRECT=OS:machine-name\private$\abc
Net.msmq://<machine-name>/private/abc 거짓 SRMP DIRECT=http://machine/msmq/private$/abc
Net.msmq://<machine-name>/private/abc 진실 원어민 PUBLIC=some-guid (큐의 GUID)

Dead-Letter 큐 또는 Poison-Message 큐에서 메시지 읽기

대상 큐의 하위 큐인 포이즌 메시지 큐에서 메시지를 읽으려면, 하위 큐의 주소를 사용해서 ServiceHost을(를) 엽니다.

예: 로컬 컴퓨터의 PurchaseOrders 프라이빗 큐의 포이즌 메시지 큐에서 읽는 서비스는 net.msmq://localhost/private/PurchaseOrders;poison를 처리합니다.

시스템 트랜잭션 데드 레터 큐에서 메시지를 읽으려면 URI는 net.msmq://localhost/system$;DeadXact 형식이어야 합니다.

시스템 비트랜잭셔널 데드레터 큐에서 메시지를 읽으려면 URI는 net.msmq://localhost/system$;DeadLetter 형식이어야 합니다.

사용자 정의 데드레터 큐를 사용하는 경우, 데드레터 큐는 반드시 로컬 컴퓨터에 있어야 합니다. 따라서 배달 못 한 편지 큐의 URI는 다음 형식으로 제한됩니다.

net.msmq: //localhost/ [private/] <사용자 정의 사망 메시지 큐 이름>.

WCF 서비스는 수신하는 모든 메시지가 수신 대기 중인 특정 큐에 주소가 지정되었는지 확인합니다. 메시지의 대상 큐가 찾은 큐와 일치하지 않으면 서비스에서 메시지를 처리하지 않습니다. 데드레터 큐에 있는 메시지는 원래 다른 곳에 배달될 예정이었기 때문에, 데드레터 큐를 수신하는 서비스가 이 문제를 해결해야 합니다. 죽은 편지 큐 또는 포이즌 메시지 큐에서 메시지를 읽으려면 ServiceBehavior 매개 변수가 설정된 Any를 사용해야 합니다. 예를 들어 Dead Letter Queues를 참조하세요.

MsmqIntegrationBinding 및 서비스 주소 지정

기존 MsmqIntegrationBinding MSMQ 애플리케이션과의 통신에 사용됩니다. 기존 MSMQ 애플리케이션과의 상호 운용을 용이하게 하기 위해 WCF는 형식 이름 주소 지정만 지원합니다. 따라서 이 바인딩을 사용하여 보낸 메시지는 URI 체계를 준수해야 합니다.

msmq.formatname:<MSMQ-format-name>>

MSMQ-format-name은 메시지 큐 정보에서 MSMQ에서 지정한 형식입니다.

큐에서 메시지를 받을 때 MsmqIntegrationBinding를 사용하려면 직접 형식 이름 및 Active Directory 통합이 필요한 공용 및 개인 형식 이름만 사용할 수 있습니다. 그러나 직접 형식 이름을 사용하는 것이 좋습니다. 예를 들어 Windows Vista에서 다른 형식 이름을 사용하면 시스템에서 직접 형식 이름으로만 열 수 있는 하위 큐를 열려고 하기 때문에 오류가 발생합니다.

SRMP를 MsmqIntegrationBinding으로 주소 지정할 때, IIS(인터넷 정보 서비스)가 디스패치하는 데 직접 형식 이름에 /msmq/를 추가할 필요가 없습니다. 예를 들어, SRMP 프로토콜을 사용하여 abc 큐에 접근할 때, DIRECT=http://adatum.com/msmq/private$/abc 대신 DIRECT=http://adatum.com/private$/abc을 사용해야 합니다.

참고로, net.msmq:// 주소를 MsmqIntegrationBinding와 함께 사용할 수 없습니다. 자유 형식 MSMQ 형식 이름 주소 지정을 지원하므로 MsmqIntegrationBinding 이 바인딩을 사용하는 WCF 서비스를 사용하여 MSMQ의 멀티캐스트 및 배포 목록 기능을 사용할 수 있습니다. 한 가지 예외는 CustomDeadLetterQueue을 사용할 때 MsmqIntegrationBinding을 지정하는 경우입니다. net.msmq://형식이어야 합니다. 이 형식은 .를 사용하여 NetMsmqBinding지정하는 방법과 유사합니다.

참고하십시오