2011-04-21 3 views
0

미리 정의 된 WSDL을 가져와 (나는 이것을 제어하지 않습니다.) 다양한 SOAP/UPnP 요청에 응답하기 위해 장치에 공개해야합니다.WCF - 일반화 된 액션 문자열

어쨌든이 모든 작업을 수행 할 수 있지만 모든 채널에서 요청할 수있는 서비스가 하나 있기 때문에 문제가 발생합니다. 나는 설명 할 것이다 :

[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:{channelNumber}", ConfigurationName="myInterface")] 
public interface myInterface 
{ 
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:{channelNumber}#GetConfiguration", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")] 
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request, String channelNumber); 
} 

I :

기본적으로
[System.ServiceModel.ServiceContractAttribute(Namespace="urn:some:namespace:1", ConfigurationName="myInterface")] 
public interface myInterface 
{ 
    [System.ServiceModel.OperationContractAttribute(Action="urn:some:namespace:1#GetConfiguration", ReplyAction="*")] 
    [System.ServiceModel.XmlSerializerFormatAttribute()] 
    [return: System.ServiceModel.MessageParameterAttribute(Name="config")] 
    MyConfigurationResponse GetConfiguration(MyConfigurationRequest request); 
} 

가, 내가 (나는이 구문이 완전히 잘못 인식하지만 난 그게 걸쳐 포인트를 얻을 것이다 생각) 할 시도하고있어 이것이다 단순히 구현중인 메소드에 매개 변수로 전달 된 원래의 액션 메시지 일부를 원합니다.

내가 구현할 수있는 다른 방법은 다른 방법을 지정하는 것이고 우리는 Action = "*"으로 Dispatcher를 호출 한 다음 OperationContext.Current.IncomingMessageHeaders.Action을 사용하여 수동으로 구문 분석합니다. 이것은 단지 일을하는 정말 그늘지는 방법처럼 보입니다. 나는 여기 주요한 장애물이 WCF에 대한 나의 경험이 없다고 확신한다.

제공 할 수있는 모든 도움을 주시면 감사하겠습니다.

감사합니다,

답변

0

이 관리하는 가장 쉬운 방법은 일반적인 메시지 처리기를 만드는 것입니다. 계약은 다음과 같이 보일 것입니다 :

[ServiceContract(SessionMode = SessionMode.Allowed)] 
public interface ICatchAll 
{ 
    [OperationContract(IsOneWay = false, Action = "*", ReplyAction = "*")] 
    Message ProcessMessage(Message message); 
} 

아이디어는 당신이 당신의 서비스 along the lines of this article.에 대해 "라우터"방법을 만들 것입니다 당신은 여전히 ​​수신 할 SOAP 메시지를 형성하기 위해 개별 채널 서비스 계약을 만들어야합니다 &이 반환되었지만 클라이언트 끝 점이 "라우터"서비스 끝점으로 이동하게됩니다. 각 채널 서비스 계약의 개별 인스턴스를 만드는 경우 새 WCF 4 RoutingService를 사용하여이 줄을 따라 뭔가를 할 수 있습니다.

+0

의견을 주셔서 감사합니다 Sixto. 곧 보게 되겠지만, 나는 아직도이 물건들로 시작하고 있습니다.어쩌면 다른 유형의 솔루션을 얻기 위해 내 질문을 다시 구성 할 수 있습니다. SVCUtil.exe에서 생성 된 인터페이스 파일을 수정하는 데 정말로 문제가 없지만 다양한 UPnP 클라이언트에서 128 개 이상의 다른 채널로 들어갈 수 있으며 3 ~ 4 개의 서비스를 손으로 코딩하는 것은 압도적입니다. –

0

동작 방법의 일반화는 와일드 카드 *이며 일반적으로 입력 및 출력 모두에 일반 Message으로 사용됩니다.

작업 선택과 매개 변수 정의 및 채우기의 전체 동작을 사용자 정의하는 방법이 있습니다. 당신은 다음과 같은 인터페이스를 확인할 수 있습니다

  • IDispatchOperationSelector가 incomming 데이터
  • IOperationInvoker에 따라 작업을 선택하는 데 사용됩니다 IDispatchOperationSelector
  • IDispatchMessageFormatter가 선택한 작업을 매개 변수를 할당하고 호출하는 데 사용되는 작업에 대한 매개 변수를 채우는 데 사용됩니다 할당 슬롯에 의해 준비 됨 IOperationInvoker

아마 모든 것을 구현할 필요는 없지만, 당신이 필요로하는 어떤 방식 으로든 예를 들어 커스텀 셀렉터 및 포맷터 체크 MSDN samples (예 : 사용자 정의 호출기 검사 this article). 어쨌든이 전체 인프라 코딩은 액션 구문 분석을 일부 WCF 내부로 옮길 것입니다. 그러나 작업 매개 변수로 가져 오기 위해서는 여전히해야 할 것입니다.

+0

이것은 내가 찾고있는 것과 더 비슷하게 들리며 결국에는 해결책을 찾게 될 것이라고 생각합니다. 나는 내일까지 그것을 시도 할 기회가 없을 것이다. 그러나 나는 그 때에 SO도 갱신 할 것이다. 많은 도움을 주실 수 있습니다. =) –

관련 문제