ContractFilter không khớp ở ngoại lệ EndpointDispatcher


116

Tôi có tình huống sau mà tôi đang cố gắng kiểm tra:

  1. Một WSDL chung
  2. Điểm cuối WCF thực hiện các đối tượng dựa trên WSDL và được lưu trữ trong IIS.
  3. Ứng dụng khách sử dụng proxy dựa trên WSDL để tạo yêu cầu.

Khi tôi thực hiện cuộc gọi dịch vụ web từ máy khách tới điểm cuối dịch vụ, tôi nhận được ngoại lệ sau:

{" Không thể xử lý thông báo có Hành động ' http: // IMyService / CreateContainer ' ở người nhận do ContractFilter không khớp ở EndpointDispatcher. Điều này có thể do hợp đồng không khớp (Hành động không khớp giữa người gửi và người nhận) hoặc ràng buộc / bảo mật không khớp giữa người gửi và người nhận. Hãy kiểm tra xem người gửi và người nhận có cùng hợp đồng và ràng buộc giống nhau không (bao gồm các yêu cầu bảo mật, ví dụ: Message, Transport, None). "}

Tôi đã bắt đầu sử dụng MS Service Trace Viewer, nhưng không biết phải tìm ở đâu. Trong khi xem xét các lớp trong máy khách và điểm cuối, chúng có vẻ giống hệt nhau.

Làm thế nào để bắt đầu gỡ lỗi vấn đề này?

Một số nguyên nhân có thể dẫn đến ngoại lệ này là gì?

Câu trả lời:


75

"ContractFilter không khớp tại EndpointDispatcher" có nghĩa là người nhận không thể xử lý tin nhắn vì nó không khớp với bất kỳ hợp đồng nào mà người nhận đã cấu hình cho điểm cuối nhận được tin nhắn.

Điều này có thể là do:

  • Bạn có các hợp đồng khác nhau giữa khách hàng và người gửi.
  • Bạn đang sử dụng một ràng buộc khác nhau giữa khách hàng và người gửi.
  • Cài đặt bảo mật thư không nhất quán giữa máy khách và người gửi.

Hãy nhìn vào EndpointDispatcher lớp học để biết thêm thông tin về chủ đề này.

Vì thế:

Đảm bảo rằng hợp đồng máy khách và máy chủ của bạn khớp với nhau.

  • Nếu bạn đã tạo ứng dụng khách của mình từ WSDL, WSDL có được cập nhật không?
  • Nếu bạn đã thực hiện một thay đổi gần đây đối với hợp đồng, bạn đã triển khai đúng phiên bản của cả máy khách và máy chủ chưa?
  • Nếu bạn đã tạo thủ công các lớp hợp đồng khách hàng của mình, hãy đảm bảo rằng không gian tên, tên phần tử và tên hành động khớp với những không gian mà máy chủ mong đợi.

Kiểm tra các ràng buộc giống nhau giữa máy khách và máy chủ.

  • Nếu bạn đang sử dụng tệp .config để quản lý các điểm cuối của mình, hãy đảm bảo các phần tử liên kết khớp nhau.

Kiểm tra các cài đặt bảo mật giống nhau giữa máy khách và máy chủ.

  • Nếu bạn đang sử dụng tệp .config để quản lý các điểm cuối của mình, hãy đảm bảo các yếu tố bảo mật khớp với nhau.

3
cũng đảm bảo thuộc tính dịch vụ chính xác trong tệp .svc. Xem câu trả lời của tôi dưới đây.
AntonK

Tôi chỉ muốn thêm vào giải pháp ở trên (cho người mới) vì tôi đã gặp phải vấn đề tương tự nhưng giải pháp trên không hiệu quả với tôi. Nếu bạn đã thử các cách giải quyết trên mà vẫn gặp lỗi tương tự, hãy thử cập nhật cấu hình của bạn bằng cách đơn giản gõ lại các điểm cuối có liên quan mặc dù nó đã đúng trên cả máy chủ và máy khách.
devpro101

74

Tôi đã gặp lỗi này và nguyên nhân là do hợp đồng thu tiền không triển khai phương thức được gọi. Về cơ bản, ai đó đã không triển khai phiên bản mới nhất của dịch vụ WCF cho máy chủ lưu trữ.


12
+1 - Điều tương tự cũng xảy ra với tôi, ngoại trừ trường hợp của tôi, chính tôi mới là "ai đó". Tôi đã quên cam kết và triển khai mã phía máy chủ.
Jesse Webb

2
Đúng, tôi đã đặt sai tên của Hành động SOAP. Nó muốn tempuri.org/ICodeGenService/RenderApp , nhưng vì một số lý do mà mã phân tích cú pháp WSDL nghĩ chỉ là tempuri.org/RenderApp .
user435779

Tôi cũng vậy. Tôi đã có phương thức trong .SVC.CS của mình, nhưng không có OperationContract tương ứng trong giao diện của tôi.
PahJoker

Tôi cũng vậy :) Tôi đã làm mới WSDL trong SoapUI bằng cách sử dụng dịch vụ cục bộ đang được phát triển và khi tôi tạo yêu cầu chống lại phương thức mới trong dịch vụ, SoapUI đã sử dụng môi trường phát triển của chúng tôi. Vì vậy, phương pháp đã hoạt động tốt, tôi chỉ truy vấn sai URL.
Larsbj

2
Cảm ơn! Tôi đã không dành hàng giờ để gỡ lỗi, thay vào đó, sau khi đọc bài này, tôi nhanh chóng nhận ra rằng mình đang gửi yêu cầu đến một môi trường sai.
Jan Matousek

20

Bạn cũng sẽ nhận được điều này nếu bạn cố gắng kết nối với URL sai ;)

Tôi có hai điểm cuối và dịch vụ được xác định trong hệ thống của mình, có tên tương tự.

Gặp lỗi chính xác này khi các URL được hoán đổi trên khách hàng của tôi tại một số điểm. Thực sự vò đầu bứt tai cho đến khi cuối cùng tìm ra sai lầm ngớ ngẩn này.


3
Đó là một sai lầm ngớ ngẩn để chắc chắn, nhưng một câu trả lời rất hữu ích ở đây. Vì nó là một cái gì đó hiển nhiên nên dễ bị bỏ qua.
mungflesh

Url sai cung cấp - lỗi 'không có điểm cuối lắng nghe'
AriesConnolly

19

Tôi gặp sự cố này và nhận thấy rằng trong trình tạo proxy của mình, mà tôi đã sao chép từ một dịch vụ khác, tôi đã quên thay đổi tên của dịch vụ.

Tôi đã thay đổi điều này ...

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

đến...

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

Đó là một lỗi mã đơn giản, nhưng gần như không thể gỡ lỗi. Tôi hy vọng điều này tiết kiệm thời gian cho ai đó.


Đó cũng là trường hợp của tôi.
Vasyl Boroviak

Cảm ơn, tôi đã có cùng một vấn đề!
Dieterg

10

Đối với một máy khách Java gọi một điểm cuối .net. Điều này là do tiêu đề Soap Action không khớp.

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

Tiêu đề HTTP ở trên hoặc thẻ XML sau cần phải khớp với hành động / phương thức mà bạn đang cố gọi.

   <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

Tôi đã giải quyết vấn đề này bằng cách thêm phần sau vào việc thực hiện hợp đồng của mình:

[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]

Ví dụ:

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

}

Điều này đã giải quyết vấn đề của tôi với một cổng chuyển tiếp. Cảm ơn bạn.
Mathias Müller

Không phải tôi gặp lỗi mới, tôi ghét IIS - CommunicationException: Máy chủ không cung cấp câu trả lời có ý nghĩa; điều này có thể do hợp đồng không khớp, phiên tắt sớm hoặc lỗi máy chủ nội bộ.
AriesConnolly

8

Tôi nhận được điều này sau khi tôi sao chép tệp svc và đổi tên nó. Mặc dù tên tệp và tệp svc.cs đã được đổi tên chính xác, đánh dấu vẫn tham chiếu đến tệp gốc.

Để khắc phục điều này, hãy nhấp chuột phải vào tệp svc đã sao chép và chọn Xem đánh dấu và thay đổi tham chiếu dịch vụ.


5

Như đã đề cập trong các câu trả lời khác, chẳng hạn như @chinto, điều này xảy ra khi phần tử tiêu đề SOAP: Action không khớp với Điểm cuối.

Bạn có thể tìm thấy URI chính xác để sử dụng bằng cách xem WSDL của máy chủ. Bạn sẽ thấy một phần tử hoạt động có con đầu vào có thuộc tính "Hành động". Đó là những gì SOAP của bạn: Hành động cần theo yêu cầu của khách hàng.

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

sau nhiều ngày googling và thử nghiệm và phát điên - câu trả lời này đã giúp tôi. cảm ơn.
babboon

trong trường hợp cụ thể của tôi, tôi đã thực hiện cuộc gọi đến WebService từ lớp java của mình bằng Apache HttpClient. Để đặt tiêu đề hành động Soap, tôi đã gọi phương thức HttpPost SetHeader ngay sau khi tôi gọi phương thức setHeader thành setContent Type.
vofili

3

Tôi gặp vấn đề tương tự. Vấn đề là tôi đã sao chép mã từ một dịch vụ khác làm điểm bắt đầu và không thay đổi lớp dịch vụ trong tệp .svc

Mở tệp .svc và đảm bảo rằng thuộc tính Dịch vụ là chính xác.

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

2

Lỗi nói rằng có sự không khớp, giả sử rằng bạn có một hợp đồng chung dựa trên cùng một WSDL, thì sự không khớp đó nằm trong cấu hình.

Ví dụ: máy khách đang sử dụng nettcpip và máy chủ được thiết lập để sử dụng http cơ bản.


2

Tôi đã gặp một lỗi tương tự. Điều này có thể là do bạn đã thay đổi một số cài đặt hợp đồng trên tệp cấu hình của mình sau khi nó được cấp lại vào dự án của bạn. giải pháp - Cập nhật tham chiếu dịch vụ web trên dự án VSstudio của bạn hoặc tạo proxy mới bằng svcutil.exe


1

Lỗi này thường xảy ra nếu mã không được triển khai đúng cách.

Trong trường hợp của tôi, tôi có hai dịch vụ ServiceA và ServiceB. Tôi nhận thấy vấn đề là tệp ServiceB không được triển khai đúng cách. Do đó khi ServiceA gọi ServiceB nội bộ, nó đã đưa ra lỗi bên dưới.

**Lỗi**

Hãy đảm bảo rằng các tệp và tham chiếu được triển khai đúng cách.


1

Tôi đã dành nhiều ngày để tìm kiếm câu trả lời và tôi đã tìm thấy nó, nhưng không có trong chủ đề này. Tôi rất mới với WCF và C #, vì vậy đối với một số câu trả lời có thể là rõ ràng.

Trong tình huống của tôi, tôi có một công cụ khách hàng ban đầu được phát triển cho dịch vụ ASMX và đối với tôi, nó đang trả về cùng một thông báo lỗi.

Sau khi thử tất cả các loại đề xuất, tôi tìm thấy trang web này:

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

Nó đưa tôi vào con đường đúng đắn. Cụ thể là "soap: operation" - WCF đã thêm ServiceName vào Namespace:

khách hàng mong đợi Http://TEST.COM/Login, nhưng WCF đã gửi Http://TEST.COM/IService1/Login. Giải pháp là thêm cài đặt [OperationContract]như thế này:

[OperationContract(Action = "http://TEST.COM/Login", ReplyAction = "http://TEST.COM/Login")] (Bỏ qua khoảng trống trong Http)


2
Tốt. Giải pháp của bạn là để dịch vụ hoạt động như một số khách hàng mong đợi. Nhưng nó cũng có thể được giải quyết tốt như nhau (hoặc trong nhiều trường hợp, tốt hơn là) được giải quyết bằng cách để máy khách thực sự tuân thủ hợp đồng của máy chủ! Rốt cuộc, máy chủ là người phát hành hợp đồng.
The Dag,

1

Điều này có thể là vì 2 lý do:

  1. ref dịch vụ đã lỗi thời, nhấp chuột phải vào service ref n cập nhật nó.

  2. hợp đồng mà bạn đã thực hiện có thể khác với những gì khách hàng có. So sánh cả hai hợp đồng dịch vụ n khách hàng sửa chữa các hợp đồng không phù hợp.


1

Nếu bạn đang gọi phương thức WCF, bạn nên đưa giao diện vào Header.

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

Ngoài ra, nó có thể hữu ích cho những người đang làm điều này bằng cách viết mã. Bạn cần thêm WebHttpBehavior () vào điểm cuối dịch vụ đã thêm của mình. Cái gì đó như:

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

Hãy xem tại: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/calling-a-rest-style-service-from-a-wcf-service


Điều này đã giúp tôi tiết kiệm thời gian của tôi, Cảm ơn bạn :)
Sely Lychee

0

Thật ngớ ngẩn, nhưng tôi đã quên thêm [OperationContract]vào giao diện dịch vụ của mình (giao diện được đánh dấu bằng [ServiceContract]) và sau đó bạn cũng gặp phải lỗi này.


0

Ứng dụng khách của bạn chưa được cập nhật Vì vậy, hãy cập nhật dịch vụ của bạn từ dịch vụ Web và sau đó xây dựng lại dự án của bạn


0

Tôi cũng có vấn đề này. Hóa ra nó được gây ra bởi trình tuần tự hợp đồng trên máy chủ. Nó không thể trả về đối tượng hợp đồng dữ liệu của tôi vì một số thành viên dữ liệu của nó là thuộc tính chỉ đọc .

Đảm bảo rằng các đối tượng của bạn có bộ thiết lập cho các thuộc tính được tuần tự hóa.


0

Thật kỳ lạ, chúng tôi đã khắc phục lỗi này bằng cách sử dụng cùng một cách viết hoa với tên Path và OperationContract được sử dụng. Rõ ràng là nó phân biệt chữ hoa chữ thường. Nếu ai biết tại sao, xin vui lòng bình luận. Cảm ơn bạn!


0

Vì vậy, trường hợp của tôi là như sau. Tôi không sử dụng proxy cho tương tác máy khách-máy chủ, tôi đã sử dụng ChannelFactory (do đó, tất cả lời khuyên để nâng cấp lên tham chiếu dịch vụ là vô nghĩa đối với tôi).

Dịch vụ được lưu trữ trong IIS và vì lý do nào đó mà nó có các tham chiếu sai trong thư mục bin ở đó. Việc biên dịch lại dự án chỉ đơn giản là không dẫn đến các dlls mới trong thư mục đó.

Vì vậy, tôi chỉ cần xóa tất cả nội dung từ đó và thêm tham chiếu đến dịch vụ trong cùng một giải pháp, sau đó biên dịch lại và bây giờ mọi thứ hoạt động.


0

Vấn đề của tôi hóa ra là một điều gì đó hiếm gặp, nhưng dù sao thì tôi cũng sẽ đề cập đến nó.

Tôi gặp sự cố khi triển khai tới môi trường phát triển của chúng tôi. Trên máy đó, người xây dựng của chúng tôi đã tạo hai thư mục (triển khai hai ứng dụng). Một phiên bản cũ và phiên bản mới hiện tại. Vì vậy, nếu bạn không có hai phiên bản ứng dụng của mình trên máy chủ web, điều này không áp dụng cho bạn.

Vị trí mới mà anh ấy đã tạo có tên không chuẩn là phần đầu tiên của url sau máy chủ:

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

Trên máy cục bộ của tôi, khách hàng của tôi đã trỏ đến tên thư mục tiêu chuẩn như đã được thiết lập trên tất cả các môi trường (ngoại trừ phát triển), bao gồm cả môi trường cục bộ của tôi.

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

Khi tôi loại bỏ và thay thế web.config đang phát triển bằng bản sao cục bộ của mình, phần url cần đặc biệt đã bị loại bỏ với phần tiêu chuẩn, do đó, khách hàng trên nhà phát triển đã trỏ đến ứng dụng cũ.

Ứng dụng cũ có một hợp đồng cũ và không hiểu yêu cầu và đã ném lỗi này.


0

Tôi đã gặp lỗi tương tự trên dịch vụ WCF được triển khai, sự cố liên quan đến dịch vụ khác được triển khai với hợp đồng khác có cùng cổng.

Giải pháp

Tôi đã sử dụng các cổng khác nhau trong web.config và sự cố đã biến mất.

Dịch vụ 1

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

Dịch vụ 2

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

Ngoài ra , tôi đã gặp phải tình huống này khi sử dụng cổng khác nhau cho cùng một địa chỉ giữa dịch vụ và người tiêu dùng.


0

Tôi gặp lỗi này vì tôi có phiên bản cũ của DLL trong GAC của máy chủ của mình. Vì vậy, hãy đảm bảo mọi thứ đều được tham chiếu chính xác và assembly / GAC được cập nhật với dll tốt.


0

Tôi đã gặp sự cố này với máy chủ thử nghiệm của mình, vì tôi đang chạy hai bản sao của cùng một wcf trên cùng một nhóm ứng dụng. Điều đã giải quyết cho tôi là tạo các nhóm riêng biệt cho từng phiên bản trên wcf của tôi và khởi động lại IIS sau đó.


0

Đối với những người đang sử dụng NodeJS với tiên đề để thực hiện các yêu cầu SOAP, bạn phải bao gồm a SOAPAction header. Kiểm tra ví dụ bên dưới:

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)
  })
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.