Lỗi WCF này có nghĩa là gì: “Cảnh báo công cụ tùy chỉnh: Không thể nhập wsdl: portType”


84

Tôi đã tạo một dự án thư viện dịch vụ WCF trong giải pháp của mình và có các tham chiếu dịch vụ đến điều này. Tôi sử dụng các dịch vụ từ thư viện lớp, vì vậy tôi có các tham chiếu từ dự án ứng dụng WPF của mình ngoài thư viện lớp. Dịch vụ được thiết lập ngay lập tức - chỉ được thay đổi để có được các chức năng dịch vụ không đồng bộ.

Mọi thứ đều hoạt động tốt - cho đến khi tôi muốn cập nhật các tham chiếu dịch vụ của mình. Nó không thành công, vì vậy cuối cùng tôi đã quay lại và thử lại, nhưng nó vẫn thất bại ngay cả sau đó! Vì vậy - cập nhật các tham chiếu dịch vụ không thành công mà không thực hiện bất kỳ thay đổi nào đối với nó. Tại sao?!

Lỗi tôi nhận được là lỗi này:

Custom tool error: Failed to generate code for the service reference 
'MyServiceReference'.  Please check other error and warning messages for details.   

Cảnh báo cung cấp thêm thông tin:

Custom tool warning: Cannot import wsdl:portType
Detail: An exception was thrown while running a WSDL import extension: 
System.ServiceModel.Description.DataContractSerializerMessageContractImporter
Error: List of referenced types contains more than one type with data contract name 'Patient' in  
namespace 'http://schemas.datacontract.org/2004/07/MyApp.Model'. Need to exclude all but one of the 
following types. Only matching types can be valid references: 
"MyApp.Dashboard.MyServiceReference.Patient, Medski.Dashboard, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
"MyApp.Model.Patient, MyApp.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" (matching)
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']

Cũng có hai cảnh báo tương tự nói:

Custom tool warning: Cannot import wsdl:binding
Detail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.
XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISomeService']
XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='WSHttpBinding_ISomeService']  

Và tương tự đối với:

Custom tool warning: Cannot import wsdl:port .. 

Tôi thấy điều này thật khó hiểu .. Tôi không có lớp Bệnh nhân trên Trang tổng quan phía máy khách ngoại trừ lớp mà tôi nhận được thông qua tham chiếu dịch vụ. Vì vậy, nó có nghĩa gì? Và tại sao nó đột nhiên hiển thị? Hãy nhớ rằng: Tôi thậm chí không thay đổi bất cứ điều gì!

Bây giờ, giải pháp cho điều này đã được tìm thấy ở đây , nhưng không có lời giải thích cho điều này có nghĩa là gì. Vì thế; trong hộp kiểm "Định cấu hình tham chiếu dịch vụ" cho dịch vụ, tôi bỏ chọn hộp kiểm "Sử dụng lại các kiểu trong hội đồng tham chiếu". Xây dựng lại bây giờ tất cả hoạt động tốt mà không có vấn đề. Nhưng tôi đã thực sự thay đổi điều gì? Điều này có ảnh hưởng đến ứng dụng của tôi không? Và khi nào người ta nên bỏ chọn điều này? Tôi muốn sử dụng lại các loại mà tôi đã thiết lập DataContract trên, nhưng không sử dụng nữa. Tôi vẫn có quyền truy cập vào những người mà không có kiểm tra này?


Ok, có một giải thích ngắn trên msdn ( msdn.microsoft.com/en-us/library/bb628653.aspx ). Nhưng có ai có một lời giải thích tốt hơn? Làm thế nào để điều này tham chiếu đến DataContract mà tôi đã thiết lập?
stiank81 09/12/09

Câu trả lời:


37

Khi bạn thêm tham chiếu dịch vụ, có hai cách có thể xử lý các loại được sử dụng bởi dịch vụ:

  • Các loại được lưu trữ trong một dll và dll đó được tham chiếu từ cả ứng dụng khách và ứng dụng máy chủ.
  • Các loại không có trong dll được tham chiếu bởi khách hàng. Trong trường hợp đó, công cụ tạo tham chiếu dịch vụ sẽ tạo các kiểu trong tệp reference.cs.

Có rất nhiều điều có thể xảy ra sai lầm. Chúng tôi nhận thấy rằng nếu công cụ gặp sự cố, việc xóa tham chiếu dịch vụ và bắt đầu lại đôi khi nhanh hơn.

Chúng tôi đã ngừng sử dụng tham chiếu dịch vụ. Đối với dự án mà chúng tôi có quyền kiểm soát của khách hàng và dịch vụ, chúng tôi sử dụng phương pháp mô tả trong này thu hình màn ảnh .


2
Cảm ơn! Tôi thực sự đã tìm thấy đoạn phim hôm qua. Đã xem nó, và nó thực sự là một thứ mở rộng tầm mắt! Tôi đang có kế hoạch chuyển sang cấu trúc đó khi tôi đã có những kiến ​​thức cơ bản. Có vẻ như bạn đang vật lộn với một số vấn đề giống như tôi đang gặp phải. Tôi thường kết thúc việc xóa và đọc các tham chiếu dịch vụ khi có sự cố kỳ lạ và đó không phải là một dấu hiệu tốt .. Hy vọng kiến ​​trúc được mô tả sẽ hữu ích!
stiank81 10/12/09

Có ai có thể viết dịch vụ web bằng tay khi bạn đang sử dụng PollingDuplex Binding với Silverlight 5 không?
Richard B

157

Tôi đã tìm thấy câu trả lời của mình ở đây: http://www.lukepuplett.com/2010/07/note-to-self-don-let-wcf-svcutil-reuse.html

Câu chuyện ngắn: Tôi đã bỏ chọn Loại sử dụng lại trong các cụm tham chiếu từ menu Nâng cao .


Tôi không biết điều này có quan trọng không nhưng tôi không sử dụng MVC mà sử dụng Biểu mẫu web.


2
Khởi

Quan tâm đến đồng hồ, nhưng liên kết bây giờ đã chết, xin vui lòng chia sẻ nếu bạn có nó ở nơi khác
Chris

1
Hoạt động trong dự án MVC 3 theo VS2013 (không cần khởi động lại).
Pawel Krakowiak

5
1 - Chỉ cần để tham khảo: Để thực hiện thay đổi này, nhấp chuột phải vào các tài liệu tham khảo phục vụ trong dự án mà tiêu thụ nó và chọn 'Configure dịch vụ tham khảo ...'
GrandMasterFlush

2
Không có gì tốt hơn sau đó là "câu chuyện dài ngắn" :)
Ron

9

Tôi cũng đã có vấn đề này hôm nay. Tôi đã mất cả ngày để tìm ra lỗi của mình. Hy vọng nó giúp.

Lớp của tôi không thể được nhập có thuộc tính kiểu enum cutom. Thuộc tính này được đánh dấu là DataMember và Enum cũng được đánh dấu là DataContract. Mọi thứ đều tốt cho đến nay. Tôi chỉ quên đánh dấu mọi thành viên enum là EnumMember.

Vì vậy, tôi đã thay đổi

[DataContract]
public enum SortMethodType
{
    Default = 0,
    Popularity = 1,
    ReleaseDate = 2,
    PublishedDate = 3,
    TranslatedTitle = 4,
    OriginalTitle = 5,
    UserRating = 6,
    Duration = 7
}

Về điều này:

[DataContract]
public enum SortMethodType
{
    [EnumMember]
    Default = 0,
    [EnumMember]
    Popularity = 1,
    [EnumMember]
    ReleaseDate = 2,
    [EnumMember]
    PublishedDate = 3,
    [EnumMember]
    TranslatedTitle = 4,
    [EnumMember]
    OriginalTitle = 5,
    [EnumMember]
    UserRating = 6,
    [EnumMember]
    Duration = 7
}

Và cuối cùng nó đã hoạt động!


8

Đi tới Thuộc tính nâng cao trong khi thêm tham chiếu và xóa "System.Window.Browser" khỏi danh sách kiểm tra, Nó giải quyết được vấn đề.


Cám ơn! Không sử dụng Tham chiếu dịch vụ nữa - thực hiện phương pháp thủ công được mô tả trong video màn hình từ câu trả lời của @Shiraz. Nhưng dù sao điều này cũng rất vui khi biết!
stiank81

8

điều đó nghe có vẻ kỳ lạ, nhưng tôi đã khắc phục sự cố bằng cách xóa các tham chiếu, sau đó đóng Visual Studio và mở lại lần nữa và cuối cùng thêm lại các tham chiếu.

Tôi nghĩ rằng công cụ tùy chỉnh cần được khởi động lại hoặc thứ gì đó.


2
ngay cả khi bạn quyết tâm tìm ra vấn đề mà KHÔNG xóa tài liệu tham khảo, tôi thực sự khuyên bạn nên tạo DỰ ÁN MỚI và thêm tài liệu tham khảo để xem nó có hoạt động không. điều này có thể tiết lộ một lỗi bạn không thấy trong dự án hiện tại của bạn hoặc nó chỉ có thể làm việc
Simon_Weaver

4

Tôi liên tục gặp lỗi này trong khi nó hoạt động trên một máy của nhà phát triển khác. Mặc dù tôi là quản trị viên đầy đủ ở mọi nơi trong máy ảo của mình, tôi đã thử đóng Visual Studio và mở lại bằng 'Run As Administrator' và nó hoạt động một cách kỳ diệu.

Chúc may mắn.


2

Tôi nhận được cảnh báo sau khi nâng cấp giải pháp của mình từ Visual Studio (VS) 2010 lên 2013 và thay đổi .NET Framework của từng dự án từ 4 thành 4.5.1. Tôi đã đóng VS và mở lại và các cảnh báo biến mất.


Điều này đã giúp tôi, nhưng tôi đã thay đổi từ .NET 4.5.2 thành 4.6 Gaa!
Jimenemex

1

Một nhược điểm của việc tắt 'các kiểu sử dụng lại trong các hội đồng tham chiếu' là nó có thể gây ra các vấn đề với các tham chiếu không rõ ràng. Điều này là do tham chiếu dịch vụ tạo lại các đối tượng đó trong tệp .cs tham chiếu và mã của bạn triển khai dịch vụ có thể đang tham chiếu chúng từ không gian tên ban đầu.

Khi trường hợp này xảy ra, tôi thấy hữu ích khi kiểm tra 'các kiểu tái sử dụng trong các hội đồng tham chiếu được chỉ định', cho phép tôi chọn những kiểu chỉ có tham chiếu không rõ ràng, cách này giải quyết vấn đề một cách nhanh chóng.

Hy vọng nó sẽ giúp ai đó khác.


0

Các giao diện của dịch vụ WCF của tôi nằm trong một assembly, việc triển khai nằm trong một assembly khác và tham chiếu dịch vụ nằm trong một assembly khác, tách biệt với các máy khách của tham chiếu dịch vụ. Tôi nhận được thông báo lỗi ngay sau khi tôi áp dụng DataContract cho một enum. Sau khi tôi áp dụng EnumMember cho các trường của enum, sự cố đã được giải quyết.


0

Nếu nghi ngờ rằng dịch vụ của bạn không có bất kỳ vấn đề nào (chẳng hạn như vấn đề với enums hoặc các lớp không thể tuần tự hóa như những người khác đã đề cập) thì hãy thử tạo một dự án mới với một tham chiếu mới.

Tôi đang sử dụng Silverlight 5 và tôi đã cố gắng xóa và tạo lại tham chiếu nhiều lần. Mỗi lần reference.cstệp tin này lại hoàn toàn trống rỗng và đã nhiều năm trôi qua kể từ khi tôi tạo ra nó, vì vậy việc cố gắng tìm ra những gì đã thay đổi trong dịch vụ là điều không thể.

Tôi nhận thấy rằng lỗi chứa các tham chiếu đến 2.0.5.0. Bây giờ tôi thậm chí không biết liệu điều này có thực sự liên quan đến phiên bản Silverlight hay không, nhưng nó khiến tôi nghĩ đến việc tạo ra một dự án hoàn toàn mới và sau đó mọi thứ đột nhiên hoạt động.

Cảnh báo 2 Cảnh báo công cụ tùy chỉnh: Không thể nhập wsdl: portType. Văn hóa = trung lập, PublicKeyToken = 7cec85d7bea7798e 'hoặc một trong những phụ thuộc của nó. Hệ thống không thể tìm thấy các tập tin được chỉ định. XPath thành lỗi Nguồn: // wsdl: định nghĩa [@targetNamespace = ''] / wsdl: port Type [@ name = 'IShoppingCart']


0

Tôi đang xem xét dự án của mình và tôi cũng gặp phải vấn đề này. Hóa ra là các phiên bản khác nhau của cùng một DLL trên Trang Web WCF so với. Trang web có phiên bản mới hơn của DLL và dịch vụ đang tham chiếu đến phiên bản cũ hơn của DLL. Một khi tất cả chúng được đồng bộ hóa, tất cả đều hoạt động tốt.


0

Tôi gặp phải lỗi tương tự. Tôi đã vật lộn trong gần một ngày để cố gắng tìm ra những gì đang xảy ra. Đầu mối cho tôi là những cảnh báo mà VS đã ném ra. Nó đang cố gắng thực hiện một số loại ánh xạ tới Yahoo.Yui.Compressor.dll, một thư viện mà tôi đã thêm và xóa (vì tôi quyết định không sử dụng nó) vài ngày trước. Thật là sốc vì thư viện không có ở đó, nhưng bằng cách nào đó nó đang cố gắng tham khảo nó.

Cuối cùng, tôi khôi phục dll này từ Thùng rác và sau đó tôi có thể cập nhật thành công tham chiếu dịch vụ của mình.


0

Đối với bất kỳ ai ở đây trong tương lai, tôi đã gặp phải lỗi tương tự nhưng do sự cố phiên bản gây ra, theo hai cách khác nhau.

Tôi có hai dịch vụ WCF và hai ứng dụng khách nói chuyện qua các tham chiếu dịch vụ. Tôi đã cập nhật gói nuget ở cả hai bên và cố gắng cập nhật tham chiếu dịch vụ và gặp lỗi này.

Xóa không giúp được gì. Việc bỏ chọn "tái sử dụng hội đồng" không được mong muốn vì tôi cần sử dụng lại chúng - đó là toàn bộ vấn đề.

Cuối cùng, có hai vấn đề riêng biệt:

1) Tôi tin rằng vấn đề đầu tiên là vấn đề bộ nhớ đệm của studio trực quan. Tôi đã xem xét tỉ mỉ tất cả các tài liệu tham khảo và không tìm thấy vấn đề nào nhưng nó vẫn thông báo rằng không thể tìm thấy phiên bản trước của tệp. Tôi đã gỡ cài đặt tất cả các gói nuget, khởi động lại visual studio và cài đặt lại chúng. Cập nhật tham chiếu dịch vụ đã hoạt động.

2) Vấn đề thứ hai là do vấn đề phụ thuộc. Tôi đã cập nhật gói nuget ở cả hai bên và mọi thứ xuất hiện chính xác, nhưng một phần phụ thuộc không được đánh dấu không đồng bộ. Thí dụ:

Gói tham chiếu Foo v1 Thanh v1. Có thể cập nhật Foo và Bar lên v2 một cách độc lập mà không cần cập nhật tham chiếu. Nếu bạn cài đặt cả Foo và Bar v2, công cụ tham chiếu dịch vụ sẽ quét Foo v2, xem tham chiếu tới Bar v1 và không thành công vì không thể tìm thấy phiên bản cũ hơn. Điều này chỉ được báo cáo chính xác nếu bạn cập nhật số phiên bản của dll cho mọi gói. Visual Studio và MSBuild sẽ không có vấn đề gì khi xây dựng ứng dụng nhưng tham chiếu dịch vụ sẽ có một khoảng thời gian khủng khiếp khi cố gắng giải quyết mọi thứ.

Tôi hi vọng điêu nay se giup được ai đo.

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.