[wcf] EndpointDispatcher 예외에서 ContractFilter 불일치

테스트하려는 다음 시나리오가 있습니다.

  1. 일반적인 WSDL
  2. WSDL을 기반으로 개체를 구현하고 IIS에서 호스팅되는 WCF 끝점입니다.
  3. WSDL을 기반으로 프록시를 사용하여 요청을 생성하는 클라이언트 앱입니다.

클라이언트에서 서비스 엔드 포인트로 웹 서비스 호출을 할 때 다음 예외가 발생합니다.

{ ” EndpointDispatcher의 ContractFilter 불일치로 인해 ‘ http : // IMyService / CreateContainer ‘ 작업이있는 메시지를 수신자에서 처리 할 수 ​​없습니다. 이는 계약 불일치 (발신자와 수신자 간의 작업 불일치) 또는 보낸 사람과받는 사람 간의 바인딩 / 보안 불일치. 보낸 사람과받는 사람이 동일한 계약과 동일한 바인딩 (예 : 메시지, 전송, 없음)을 포함하는지 확인합니다. “}

MS Service Trace Viewer를 사용하기 시작했지만 어디를보아야할지 모르겠습니다. 클라이언트와 끝점의 클래스를 보면 동일하게 보입니다.

이 문제를 어떻게 디버깅하기 시작합니까?

이 예외의 가능한 원인은 무엇입니까?



답변

“EndpointDispatcher에서 ContractFilter 불일치”는 수신자가 메시지를 수신 한 엔드 포인트에 대해 구성한 계약과 일치하지 않기 때문에 수신자가 메시지를 처리 ​​할 수 ​​없음을 의미합니다.

그 이유는 다음과 같습니다.

  • 클라이언트와 발신자간에 서로 다른 계약이 있습니다.
  • 클라이언트와 발신자간에 다른 바인딩을 사용하고 있습니다.
  • 클라이언트와 보낸 사람간에 메시지 보안 설정이 일치하지 않습니다.

EndpointDispatcher주제에 대한 자세한 내용 은 수업을 참조하십시오.

그래서:

클라이언트와 서버 계약이 일치하는지 확인하십시오.

  • WSDL에서 클라이언트를 생성 한 경우 WSDL이 최신입니까?
  • 최근 계약을 변경 한 경우 클라이언트와 서버의 올바른 버전을 배포 했습니까?
  • 클라이언트 계약 클래스를 직접 만든 경우 네임 스페이스, 요소 이름 및 작업 이름이 서버에서 예상하는 이름과 일치하는지 확인합니다.

바인딩이 클라이언트와 서버간에 동일한 지 확인하십시오.

  • .config 파일을 사용하여 엔드 포인트를 관리하는 경우 바인딩 요소가 일치하는지 확인하십시오.

보안 설정이 클라이언트와 서버간에 동일한 지 확인하십시오.

  • .config 파일을 사용하여 엔드 포인트를 관리하는 경우 보안 요소가 일치하는지 확인하십시오.

답변

이 오류가 발생했으며 수신자 계약이 호출되는 메서드를 구현하지 않아서 발생했습니다. 기본적으로 누군가가 최신 버전의 WCF 서비스를 호스트 서버에 배포하지 않았습니다.


답변

잘못된 URL 에 연결하려고하면이 메시지가 표시됩니다 .)

내 시스템에 비슷한 이름으로 정의 된 두 개의 엔드 포인트와 서비스가 있습니다.

내 클라이언트에서 URL이 어느 시점에서 바뀌었을 때이 정확한 오류가 발생했습니다. 이 멍청한 실수를 마침내 알아낼 때까지 머리를 긁었습니다.


답변

이 문제가 발생하여 다른 서비스에서 복사 한 프록시 생성기에서 서비스 이름을 변경하는 것을 잊었습니다.

나는 이것을 바꿨다 …

Return New Service1DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service1Data.svc"))

에…

Return New Service2DataClient(binding, New EndpointAddress(My.Settings.WCFServiceURL & "/Service2Data.svc"))

단순한 코드 오류 였지만 디버깅이 거의 불가능했습니다. 나는 이것이 누군가의 시간을 절약하기를 바랍니다.


답변

.net 엔드 포인트를 호출하는 Java 클라이언트의 경우. 이는 Soap Action 헤더가 일치하지 않아 발생했습니다.

Content-Type: application/soap+xml;charset=UTF-8;action="http://example.org/ExampleWS/exampleMethod"

위의 HTTP 헤더 또는 다음 XML 태그는 호출하려는 작업 / 메소드와 일치해야합니다.

   <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:tem="http://tempuri.org/" xmlns:gen="http://schemas.datacontract.org/2004/07/GenesysOnline.WCFServices">
   <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing">
      <wsa:To>https://example.org/v1/Service.svc</wsa:To>
      <wsa:Action>http://example.org/ExampleWS/exampleMethod</wsa:Action>
   </soap:Header>
   <soap:Body>
    ...
   </soap:Body>
</soap:Envelope>


답변

내 계약 구현에 다음을 추가하여이 문제를 해결했습니다.

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

예를 들면 :

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class MyUploadService : IMyUploadService
{

}


답변

svc 파일을 복사하고 이름을 바꾼 후에 이것을 얻었습니다. 파일 이름과 svc.cs 파일의 이름이 올바르게 변경되었지만 마크 업은 여전히 ​​원본 파일을 참조했습니다.

이 문제를 해결하려면 복사 된 svc 파일을 마우스 오른쪽 버튼으로 클릭하고 마크 업보기를 선택 하고 서비스 참조를 변경합니다.