2013-08-16 3 views
7

나는 WCF 서비스를 가지고있다. 전화 번호는 UserService이다. UserService에는 클래스 라이브러리에 대한 참조가 있습니다. DoWork.dll이라고합시다. DoWork.dll에는 CompanyService이라고하는 다른 서비스에 대한 WCF 서비스 참조가 있습니다.WCF 끝점 구성 오류 : 'contract'속성이 유효하지 않습니까?

이제는 UserService을 처음 호출 할 때 구성되지 않은 엔드 포인트 오류 메시지가 표시됩니다. 웹 주위를 읽은 후에 바인딩과 클라이언트 정보를 의 web.config에 넣고 <system.serviceModel> 노드 아래에 추가해야한다는 것을 발견했습니다. 여기

그것입니다

<system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IComapnyService" /> 
     </basicHttpBinding> 
    </bindings> 
    <client> 
     <endpoint name="BasicHttpBinding_ICompanyService" 
      address="http://it-dev.company.local:81/Project/Copmpany/CompanyService.svc" 
      binding="basicHttpBinding" 
      bindingConfiguration="BasicHttpBinding_IComapnyService" 
      contract="CompanyService.ICompanyService" /> 
    </client> 

내가 가진 문제는 contract="CompanyService.ICompanyService" 나에게 오류 표시입니다 : 나는 UserService WCF 프로젝트에 직접 CompanyService 참조를 추가하는 경우, 지금

The 'contract' attribute is invalid - The value 'CompanyService.ICompanyService' is invalid according to its datatype 'clientContractType' - The Enumeration constraint failed.

을의이 오류가 사라집니다 (분명히). 그러나 나는 이것을 할 필요가 없다. 나는 ICompanyService 계약이 존재하는 네임 스페이스를 완전히 예선하려고 시도했으나 작동하지 않습니다. .suo 파일을 삭제하고 프로젝트를 다시 작성했으나 작동하지 않습니다 (웹의 다른 곳에서 제안 됨). 또한 contract=을 입력하면 드롭 다운 목록이 표시되지만 CompanyService.ICompanyService은 찾을 수 없습니다 (UserService 프로젝트에서 직접 서비스를 참조 할 때만).

Tools > WCF Service Configuration Editor을 사용하여 구성을 시도했지만 도움이되지 않습니다.

나는 모든 것이 잘 작동하는 것처럼 보이지만 intellisense가 나에게 파란색의 구불 구불 한 밑줄과 그 오류 메시지를주고 있다는 사실을 싫어한다. 나는 UserServiceDoWork.dll을 참조하고, 계약서를 제대로 볼 수없는 CompanyService을 참조하기 때문에 이것을 얻으려면 web.config에 뭔가가 필요하다고 느낍니다.

모든 의견을 보내 주시면 감사하겠습니다. 미리 감사드립니다.

+0

나는 최근에이 문제를 발견했으며 실제로 전체 네임 스페이스를 포함하는 것이 내 문제를 해결하는 것으로 나타났습니다. 이 문제가있는 다른 누구에게나 유용합니다. – Ian

답변

2

맞아요. 이럴 필요가 없습니다.

"서비스 참조"(ComanyService)가있는 DLL (DoWork.dll)을 갖는 아키텍처가 잘못되었습니다. DLL이 당신을 위해 CompanyService를 호출하기 위해 코드에서 클라이언트 엔드 포인트를 하드 코딩하지 않았다면, DLL을 사용하는 모든 사람들은 그들이 모르는 서비스에 대해 클라이언트 엔드 포인트를 구성하는 방법을 알아 내려고 시도해야 할 것입니다. 당신이 뛰어 다니는 것이 무엇입니까.

UserService에서 직접 서비스 참조를 추가하는 이유는 이렇게하면 CompanyService 메타 데이터에서 ServiceContract 사본을 얻게된다는 것입니다. 이것을 증명하려면, 생성 된 Reference.cs 파일을보고 CompanyService를 검색하면 WCF 서비스로 식별되는 [ServiceContract] 특성이 있습니다. 또한 메소드의 [OperationContract] 속성과 서비스가 교환하는 [DataContracts] 속성을 볼 수 있습니다. 즉, 이러한 모든 "유형"을 프로젝트로 가져오고 컴파일 할 때 WCF는 이제 클라이언트 끝점을 인스턴스화 할 때 이러한 유형을 찾을 수 있습니다.

CompanyService가 서비스 중 하나 인 경우 ServiceContract 정의 (인터페이스)를 별도의 DLL로 추출하는 것이 좋습니다. 그런 다음 이러한 유형을 서비스 (CompanyService) 및 UserService와 같은 클라이언트 응용 프로그램에서 "어셈블리 참조"로 참조 할 수 있습니다.최소한 서비스 참조를 추가 할 필요는 없습니다. 그러나 기술적으로 세부 사항을 알지 못하는 서비스에 대해서는 애플리케이션의 섹션에 채워야합니다. 최선의 방법은 아닙니다.

더 나은 방법은 서비스 종속성을 DoWork.dll 밖으로 이동하는 것입니다. 논리를 UserService 구현으로 이동하면됩니다.

DoWork.dll을 독립적으로 유지해야하는 경우 CompanyService에 종속되는 WCF 서비스에 DoWork를 래핑하는 것이 좋습니다. 그런 다음 UserService에서 새 DoWork 서비스에 대한 서비스 참조를 추가하십시오. 이것은 SOA의 세입자들과 더 잘 어울리 며 서비스가 독자적으로 발전 할 수있게 해줍니다.

+0

정보를 제공해 주셔서 감사합니다. 어쩌면 내 건축이 나쁘 겠지. CompanyService는 WCF 서비스 일 뿐이므로 InstanceContextMode.Single의 서비스 동작을 통해 싱글 톤처럼 작동해야합니다. 이제는 내 시스템에서 CompanyService의 한 서비스 메서드를 DoWork.DLL이 아닌 다른 곳에서 호출해서는 안됩니다. 그래서 내 후속 질문은 DoWork.DLL의 끝점을 하드 코드해야합니까? 아니면 함께 ComapnyService를 모두 제거해야하고 어떻게 든 DoWork.dll에 논리를 옮겨야합니다 (어떻게 든 싱글턴 동작을 유지하고 있습니까?). 감사. – BBauer42

+1

아니오, 엔드 포인트를 하드 코드하지 마십시오. 내가 제시 한 마지막 옵션은 아마도 자신의 시나리오에서 가장 잘 작동 할 것입니다. DoWork.DLL을 래핑하는 서비스가 CompanyService를 호출 할 수있는 유일한 서비스임을 보장하는 방법 (보안 설정을 통해)이 있습니다. 그래서, 이런 것이 있습니다. UserService <--> NewWrapperService (dowork) <--> CompanyService –