2011-03-08 8 views
1

좋습니다. 내가 만들고 싶은 WCF 서비스에 대한 몇 가지 개념적인 문제가 있습니다. 간단히 말해서 원격 기능을 제공하는 독립 실행 형 Windows 서비스를 만들어야합니다 (.NET 1.1 원격 응용 프로그램 대체).WCF 콘솔 응용 프로그램 독립 실행 형/독립 실행 형 서비스

일부 일반적인 개념은 나는 현재를 이해 :

  1. 내가 먼저 WCF 호스팅 기능을 제공하는 콘솔 응용 프로그램을 작성하여이 작업을 수행 할 수 있습니다.
  2. 그러면이 콘솔 응용 프로그램을 .NET에서 사용할 수있는 "서비스 작성"메커니즘을 통해 서비스로 배포 할 것입니다. IDE를 사용하면 매우 간단합니다.이 부분은 어렵지 않습니다.

편집 : Windows 서비스를 만들고 OnStart()에서 서비스 호스트를 연 다음 OnStop()에서 닫는 것이 더 좋을 수도 있습니다. 아마도이 작업을 수행 할 것입니다. 그러나 혼란 스러울만한 것들 중 하나는 내가보고있는 몇 가지 예제가이 메커니즘과 비교하여 간단한 콘솔 앱을 작성하는 것에 대해 이야기한다는 것입니다 ...

여기에 현재 상황이 나와 있습니다. 우리는 인터페이스를 가지고 있으며 SQL 서버에 대한 호출을 구현하는 IData라고 부를 것입니다. 현재, 기본 Execute_Query 및 Execute_NonQuery 메소드가있는 RemData를 호출 할 클래스에 IData를 구현합니다.

따라서, IDATA 보이는 같은 : 내 인터페이스 정의에서, 나는 WCF 물건에 대한 속성 (서비스 계약 및 OperationContract를)를 추가하는 방법을

[ServiceContract()] 
public Interface IData 
{ 
    [OperationContract()] 
    int Execute_Query(parameter list....); // parameter list shouldn't be important here I hope. 

    [OperationContract()] 
    int Execute_NonQuery(parameter list....); 
} 

참고. 이것은 내 질문 중 하나의 중심입니다.

RemData는 IData를 구현합니다. 우리는 DLL로 별도로 빌드합니다.

이제 콘솔 응용 프로그램을 만들고 인터페이스 IData에 대한 정의와 RemData에 대한 참조를 포함하는 DLL에 대한 참조를 포함 할 수 있도록 WCF를 구현해야합니다 (예, 그들은 두 개의 별도 어셈블리에 있습니다. 나를).

다음은 나를위한 까다로운 부분입니다. 나는 서비스를 내포해야하므로, 나는이 방법으로 그것을 할 수 있다고 생각하고있다. 먼저 RemData 클래스를 수정하고 System.ServiceModel을 참조로 추가 한 다음 [ServiceBehavior()] 특성으로 클래스를 꾸미고 내 Interface와 일치하는 각 메서드에 [OperationBehavior()] 특성을 추가합니다.

  1. 이것은 좋은 공격 계획입니까?

  2. 이 계획을 수행하면 클래스에 [ServiceBehavior()] 속성을 추가 한 다음 [OperationBehavior()] 특성을 사용하여 클래스의 각 메서드를 장식합니까? OperationBehavior 특성도 전혀 필요합니까? 그래도 ServiceBehavior 속성이 필요하다고 확신합니다.

  3. 그러면 인터페이스의 ServiceContract 및 OperationContract 특성과 일치합니다. 맞습니까?

  4. 원본에서 (여러 가지로) 과부하 된 Execute_Query() 및 Execute_NonQuery() 메서드가있는 경우 어떻게됩니까?

    [의 ServiceContract()] 공용 인터페이스 IDATA { [OperationContract를 (이름 = "Execute_QueryA")] INT의 Execute_Query (매개 변수 목록 : 나는 OperationContract를 속성에 이름 매개 변수를 사용하여 인터페이스를 정의하는 방법을 알고 ....); // 여기서 매개 변수 목록은 중요하지 않아야합니다.

    [OperationContract (Name = "Execute_NonQueryA")] int Execute_NonQuery (매개 변수 목록 ....);

    [OperationContract (Name = "Execute_QueryB")] int Execute_Query (매개 변수 목록 ....); // 여기서 매개 변수 목록은 중요하지 않아야합니다.

    [OperationContract (Name = "Execute_NonQueryB")] int Execute_NonQuery (매개 변수 목록 ....);

    }

  5. , 나는 실제 구현을 위해 무엇을해야합니까? [OperationBehavior()]를 그대로두고 매개 변수를 추가하지 않습니까? 이름 매개 변수가없는 것 같습니다.

내가 넘어 유용한 정보의 전체 많이 찾는 아니에요 때문에

나는 좋은 기사에 대한 모든이의 생각이나 링크를 감사하겠습니다 이봐, 난 IIS에서 호스팅 단일 통화 WCF 서비스를 만들어 "기본 ... "

고맙습니다.

답변

0

계획은 괜찮지 만, 뭔가 특별한 일을하지 않는 한 [OperationBehavior]로 각 메소드 구현을 장식하지 않아도됩니다.

귀하의 오버로드하지만, 고유의 매개 변수가 필요합니다, 그렇지 않으면 당신은 그들에게 다른 이름, 예를 제공해야합니다

OperationContract를의 이름 속성은이 방법의 여러 재 지정을 가능하게하는 것은 아닙니다
[OperationContract()] 
int Execute_NonQueryA(parameter list); 

[OperationContract()] 
int Execute_NonQueryB(parameter list); 

동일한 C# 시그니처로 호출자의 관점에서 메서드의 이름을 바꿀뿐입니다.

+0

예. 각 메소드마다 다른 서명이 있습니다. 나는이 토론을 위해 간단하게 유지하고있다. 나는 단지 내가 올바른 접근 방식을 가지고 있는지 확인하고 싶다. 감사! – Dan7el

0

독립 실행 형 서비스가되는 콘솔 앱의 경우, 저에게 잘 맞는 Topshelf을 제안합니다. 또한 this codeproject.com 동적로드 WCF 서비스 프레임 워크에 관한 기사도 잘 작동합니다. 그것들을 모으는 것이 제가 취하는 접근법입니다.

1
  1. 계약의 정의와 구현은 두 개의 서로 다른 프로젝트 (DLL을)
  2. 당신이 인 ServiceBehavior 및 인 OperationBehavior 같은 속성을 추가로 붙어있는 이유는 확실하지에있을 수 있습니다. 추가 할 동작이 없으면 더 잘 제거하십시오.
  3. 과부하가 아닌 다른 이름으로 가야합니다.
관련 문제