EndpointDispatcher 예외에서 ContractFilter 불일치


116

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

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

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

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

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

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

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

답변:


75

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

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

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

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

그래서:

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

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

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

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

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

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

3
또한 .svc 파일에서 서비스 속성이 올바른지 확인하십시오. 아래 내 대답을 참조하십시오.
AntonK

동일한 문제가 발생했기 때문에 위의 솔루션에 추가하고 싶었지만 위의 솔루션이 저에게 효과가 없었습니다. 위의 해결 방법을 이미 시도했지만 여전히 동일한 오류가 발생하는 경우 서버와 클라이언트 모두에서 이미 올바른 경우에도 관련된 엔드 포인트를 간단히 다시 입력하여 구성을 업데이트 해보십시오.
devpro101

74

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


12
+1-나에게도 똑같은 일이 일어 났지만, 내 경우에는 "누군가"가 나였다. 서버 측 코드를 커밋하고 배포하는 것을 잊었습니다.
Jesse Webb

2
네, SOAP Action의 이름이 잘못되었습니다. tempuri.org/ICodeGenService/RenderApp을 원했지만 어떤 이유로 WSDL을 구문 분석 한 코드는 tempuri.org/RenderApp 만 생각했습니다 .
user435779

나도. 내 .SVC.CS에 메서드가 있지만 인터페이스에는 해당 OperationContract가 없습니다.
PahJoker 2013

나도 :) 개발중인 로컬 서비스를 사용하여 SoapUI의 WSDL을 새로 고쳤으며 서비스의 새 메서드에 대한 요청을 만들 때 SoapUI는 개발 환경을 사용했습니다. 그래서 방법이 잘 작동했고 잘못된 URL을 쿼리했습니다.
Larsbj

2
감사! 나는 디버깅에 몇 시간을 소비하지 않고 대신 이것을 읽은 후 나는 잘못된 환경으로 요청을 보내고 있다는 것을 금방 깨달았습니다.
Jan Matousek

20

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

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

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


3
확실히하는 것은 어리석은 실수이지만 여기서 매우 유용한 대답입니다. 분명한 것이기 때문에 쉽게 간과됩니다.
mungflesh

잘못된 URL 제공- 'there was no endpoint listen'오류
AriesConnolly

19

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

나는 이것을 바꿨다 ...

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

에...

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

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


그것도 제 경우였습니다.
Vasyl Boroviak

고마워, 나도 같은 문제가 있었다!
Dieterg 2014 년

10

.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>

9

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

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

예를 들면 :

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

}

이것은 전달 된 포트에 대한 내 문제를 해결했습니다. 감사합니다.
Mathias Müller

새로운 오류가 발생하지 않았습니다. IIS가 싫어요-CommunicationException : 서버가 의미있는 응답을 제공하지 않았습니다. 이는 계약 불일치, 조기 세션 종료 또는 내부 서버 오류로 인해 발생할 수 있습니다.
AriesConnolly

8

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

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


5

@chinto와 같은 다른 답변에서 언급했듯이 SOAP : Action 헤더 요소가 Endpoint와 일치하지 않을 때 발생합니다.

서버의 WSDL을 살펴보면 사용할 올바른 URI를 찾을 수 있습니다. "Action"속성이있는 입력 하위가있는 오퍼레이션 요소가 표시됩니다. 이것이 SOAP : Action이 클라이언트 요청에 있어야하는 것입니다.

<wsdl:operation name="MethodName">
<wsdl:input wsaw:Action="http://tempuri.org/IInterface/MethodName" message="tns:IInterface_MethodName_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IInterface/MethodNameResponse" message="tns:IInterface_MethodName_OutputMessage"/>
</wsdl:operation>

며칠 동안 인터넷 검색과 테스트를 거쳐 미쳐가는이 답변이 도움이되었습니다. 감사.
babboon

내 특정 시나리오에서 Apache HttpClient를 사용하여 Java 클래스에서 WebService를 호출했습니다. Soap 액션 헤더를 설정하기 위해 setHeader 메서드를 setContent Type으로 호출 한 직후에 HttpPost SetHeader 메서드를 호출했습니다.
vofili

3

나는 같은 문제가 있었다. 문제는 다른 서비스의 코드를 시작점으로 복사하고 .svc 파일의 서비스 클래스를 변경하지 않았다는 것입니다.

.svc 파일을 열고 서비스 속성이 올바른지 확인하십시오.

 <%@ ServiceHost Language="C#" Debug="true" Service="SME.WCF.ApplicationServices.ReportRenderer" CodeBehind="ReportRenderer.svc.cs" %>

2

오류는 동일한 WSDL을 기반으로하는 공통 계약이 있다고 가정하고 불일치가 있음을 나타내며 불일치가 구성에 있습니다.

예를 들어 클라이언트는 nettcpip를 사용하고 서버는 기본 http를 사용하도록 설정되어 있습니다.


2

비슷한 오류가 발생했습니다. 이는 구성 파일이 프로젝트에 참조 된 후 일부 계약 설정을 변경했기 때문일 수 있습니다. 솔루션-VSstudio 프로젝트에서 웹 서비스 참조를 업데이트하거나 svcutil.exe를 사용하여 새 프록시를 만듭니다.


1

이 오류는 일반적으로 코드가 제대로 배포되지 않은 경우 발생합니다.

제 경우에는 ServiceA와 ServiceB의 두 가지 서비스가 있습니다. ServiceB 파일이 제대로 배포되지 않는 문제를 발견했습니다. 그 때문에 ServiceA가 내부적으로 ServiceB를 호출 할 때 아래 오류가 발생했습니다.

**오류**

파일과 참조가 제대로 배포되었는지 확인하십시오.


1

나는 대답을 찾기 위해 며칠을 보냈고 그것을 찾았지만이 스레드에는 없습니다. 저는 WCF와 C #을 처음 접했기 때문에 대답이 분명 할 수도 있습니다.

제 상황에서는 원래 ASMX 서비스 용으로 개발 된 클라이언트 도구가 있었고 저에게는 동일한 오류 메시지가 반환되었습니다.

모든 종류의 권장 사항을 시도한 후이 사이트를 찾았습니다.

http://myshittycode.com/2013/10/01/the-message-with-action-cannot-be-processed-at-the-receiver-due-to-a-contractfilter-mismatch-at-the-endpointdispatcher/

그것은 나를 올바른 길로 인도했습니다. 특히 "soap : operation"-WCF가 ServiceName을 네임 스페이스에 추가했습니다.

클라이언트가 예상 Http://TEST.COM/Login했지만 WCF가 보냈습니다 Http://TEST.COM/IService1/Login. 해결책은 [OperationContract]다음과 같이 설정을 추가하는 것입니다.

[OperationContract(Action = "http://TEST.COM/Login", ReplyAction = "http://TEST.COM/Login")] (Http에서 공백 무시)


2
잘. 솔루션은 일부 클라이언트가 예상 한대로 서비스가 작동하도록하는 것입니다. 그러나 클라이언트가 실제로 서버의 계약을 준수하도록함으로써 똑같이 잘 (또는 많은 경우에 바람직하게는) 해결할 수 있습니다! 결국 서버는 계약의 발행자입니다.
The Dag

1

이것은 두 가지 이유 때문일 수 있습니다.

  1. 서비스 참조가 오래되었습니다. 서비스 참조를 마우스 오른쪽 버튼으로 클릭하여 업데이트하십시오.

  2. 당신이 구현 한 계약은 클라이언트가 가진 것과 다를 수 있습니다. 두 서비스 n 클라이언트 계약을 비교하고 계약 불일치를 수정하십시오.


1

WCF 메서드를 호출하는 경우 헤더에 인터페이스를 포함해야합니다.

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Url);
if (Url.Contains(".svc"))
{
    isWCFService = true;
    req.Headers.Add("SOAPAction", "http://tempuri.org/WCF_INterface/GetAPIKeys");
}
else 
{
    req.Headers.Add("SOAPAction", "\"http://tempuri.org/" + asmxMethodName+ "\"");
}

1

또한 코딩으로이 작업을 수행하는 사람들에게 유용 할 수 있습니다. 추가 된 서비스 엔드 포인트에 WebHttpBehavior ()를 추가해야합니다. 다음과 같은 것 :

restHost.AddServiceEndpoint(typeof(IRestInterface), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior()); 

살펴보기 : https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/calling-a-rest-style-service-from-a-wcf-service


이것은 내 시간을 저장, 감사합니다 :) 나를 도와
Sely 열매를

0

어리석은 일이지만 [OperationContract]내 서비스 인터페이스 (로 표시된 인터페이스) 에 추가 하는 것을 잊은 [ServiceContract]다음이 오류도 발생합니다.


0

클라이언트가 업데이트되지 않았으므로 웹 서비스에서 서비스를 업데이트 한 다음 프로젝트를 다시 빌드하십시오.


0

나도이 문제가 있었다. 서버 측의 계약 시리얼 라이저로 인해 발생한 것으로 밝혀졌습니다. 데이터 멤버 중 일부가 읽기 전용 속성이기 때문에 내 데이터 계약 개체를 반환 할 수 없습니다 .

개체에 serialize 할 속성에 대한 setter가 있는지 확인하십시오.


0

이상하게도 사용 된 Path 및 OperationContract 이름과 동일한 대 / 소문자를 사용하여이 오류를 해결했습니다. 분명히 대소 문자를 구분했습니다. 이유를 아는 사람이 있으면 의견을 말하십시오. 감사합니다!


0

그래서 제 경우는 다음과 같습니다. 저는 클라이언트-서버 상호 작용에 프록시를 사용하지 않았고, ChannelFactory를 사용했습니다 (따라서 서비스 참조로 업그레이드하라는 모든 조언은 나에게 의미가 없었습니다).

서비스는 IIS에서 호스팅되었으며 어떤 이유로 bin 폴더에 잘못된 참조가 있습니다. 프로젝트 재 컴파일은 단순히 해당 폴더에 새 dll로 이어지지 않았습니다.

그래서 방금 거기에서 모든 것을 삭제하고 동일한 솔루션의 서비스에 대한 참조를 추가 한 다음 다시 컴파일하고 이제 모든 것이 작동합니다.


0

내 문제는 드문 것으로 판명되었지만 어쨌든 언급하겠습니다.

개발 환경에 배포하는 데 문제가 발생했습니다. 그 컴퓨터에서 우리의 빌드 담당자는 두 개의 폴더를 만들었습니다 (두 개의 응용 프로그램을 배포했습니다). 이전 버전과 새 현재 버전. 따라서 웹 서버에 두 가지 버전의 애플리케이션이없는 경우에는 적용되지 않습니다.

그가 만든 새 위치에는 호스트 뒤의 URL 첫 부분에 비표준 이름이 있습니다.

net.tcp://dev.umbrellacorp.com/DifferentFolderName/MyProvider

내 로컬 컴퓨터에서 내 클라이언트는 내 로컬 환경을 포함한 모든 환경 (개발 제외)에 설정된 표준 폴더 이름을 가리키고있었습니다.

net.tcp://dev.umbrellacorp.com/AppServices/MyProvider

내가 날아가서 개발시 web.config를 로컬 사본으로 대체했을 때 특별해야 할 URL 부분이 표준 부분으로 날아가서 결과적으로 dev의 클라이언트가 이전 응용 프로그램을 가리 켰습니다.

이전 응용 프로그램에는 이전 계약이 있었고 요청을 이해하지 못하여이 오류가 발생했습니다.


0

배포 된 WCF 서비스에서 동일한 오류가 발생했습니다. 문제는 동일한 포트를 가진 다른 계약으로 배포 된 다른 서비스와 관련이 있습니다.

해결책

web.config에서 다른 포트를 사용했는데 문제가 사라졌습니다.

서비스 1

contract="Service.WCF.Contracts.IBusiness1" 
baseAddress="net.tcp://local:5244/ServiceBusiness" 

서비스 2

contract="Service.WCF.Contracts.IBusiness2"
baseAddress="net.tcp://local:5243/ServiceBusiness"

또한 서비스와 소비자간에 동일한 주소에 대해 다른 포트를 사용하여 이러한 상황에 직면했습니다.


0

내 서버의 GAC에 이전 버전의 DLL이 있기 때문에이 오류가 발생했습니다. 따라서 모든 것이 올바르게 참조되고 어셈블리 / GAC가 좋은 dll로 최신 상태인지 확인하십시오.


0

동일한 앱 풀에서 동일한 wcf의 두 복사본을 실행했기 때문에 테스트 서버 에서이 문제가 발생했습니다. 나를 위해 해결 된 것은 내 wcf에서 각 버전에 대해 별도의 풀을 만들고 그 후에 IIS를 다시 시작하는 것입니다.


0

와 NodeJS를 사용하는 사람들을 위해 Axios의이 는 SOAP 요청을 만들기 위해 당신이 포함되어야합니다 SOAPAction header. 아래 예를 확인하십시오.

axios.post('https://wscredhomosocinalparceria.facilinformatica.com.br/WCF/Soap/Emprestimo.svc?wsdl',
           xmls,
  {headers:
  {
    'Content-Type': 'text/xml',
    SOAPAction: 'http://schemas.facilinformatica.com.br/Facil.Credito.WsCred/IEmprestimo/CalcularPrevisaoDeParcelas'}
  }).then(res => {
    console.log(res)
  }).catch(err => {
    console.log(err.response.data)
  })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.