테스트하려는 다음 시나리오가 있습니다.
- 일반적인 WSDL
- WSDL을 기반으로 개체를 구현하고 IIS에서 호스팅되는 WCF 끝점입니다.
- 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 파일을 마우스 오른쪽 버튼으로 클릭하고 마크 업보기를 선택 하고 서비스 참조를 변경합니다.
