2009-11-09 32 views
5

Sự cố với "Thêm tham chiếu dịch vụ" và thực sự với SvcUtil trên tất cả các tính năng của nó. Để tái tạo bạn chỉ cần thêm một OperationContract với lập luận hoặc trả lại lớp sau đây:WCF AddServiceReference gây lỗi công cụ tùy chỉnh, không tạo proxy

[XmlSchemaProvider("MySchema")] 
public class MyStructure : IXmlSerializable 
{ 
    private XmlElement e; 

    private static void Func(object o, ValidationEventArgs args) 
    { 
    } 

    public static XmlQualifiedName MySchema(XmlSchemaSet xs) 
    { 
     //xs.XmlResolver = new XmlUrlResolver();    
     XmlSchema s = XmlSchema.Read(new XmlTextReader(new StringReader("<?xml version=\"1.0\"?><xs:schema xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"><xs:complexType name=\"MyStructure\"><xs:sequence><xs:any /></xs:sequence></xs:complexType></xs:schema>")), null); 

     xs.Add(s); 
     return new XmlQualifiedName("MyStructure"); 
    } 

    #region IXmlSerializable Members 

    public System.Xml.Schema.XmlSchema GetSchema() 
    { 
     throw new NotImplementedException(); 
    } 

    public void ReadXml(XmlReader reader) 
    { 
     XmlDocument doc = new XmlDocument(); 
     e = (XmlElement)doc.ReadNode(reader); 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     e.WriteTo(writer); 
    } 

    #endregion 
} 

Kết quả là khi bạn sử dụng AddWebReference hoặc AddSerivceReference mà không có một tham chiếu đến thư viện lớp có chứa các loại MyStructure, tất cả mọi thứ sẽ là quảng cáo tốt, bạn sẽ nhận được một đại diện xmlElement tại proxy được tạo tự động.

Tuy nhiên, khi bạn có một tài liệu tham khảo bạn sẽ nhận được cảnh báo sau đây:

================

Cảnh báo cảnh báo công cụ 1 tùy chỉnh: Không thể nhập khẩu wsdl: portType Chi tiết: Một ngoại lệ được ném trong khi chạy phần mở rộng nhập WSDL: System.ServiceModel.Description.DataContractSerializerMessageContractImporter Lỗi: Loại tham chiếu 'ServiceLibrary.MyStructure, ServiceLibrary, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null' với tên hợp đồng dữ liệu 'MyStructure' trong không gian tên '' không thể được sử dụng vì nó không khớp với DataContract đã nhập. Cần loại trừ loại này khỏi các loại được tham chiếu. XPath đến lỗi Nguồn: // wsdl: định nghĩa [@ targetNamespace = 'http://tempuri.org/']/wsdl: portType [@ name = 'IService1'] \ Projects \ WCFSample \ WCFExample \ TestAddReference \ Dịch vụ Tài liệu tham khảo \ ServiceReference1 \ Reference.svcmap 1 1 TestAddReference

======================

Và không có proxy nào được tạo cho bạn.

Bây giờ, Internet đầy với các mô tả về điều này khi bạn có một DataContract chung và/hoặc sử dụng thuộc tính IsReference.

Đây là một vấn đề nghiêm trọng, vì mọi dữ liệu không được nhập sẽ làm vấn đề này. Không thể tìm thấy bất kỳ cách nào để giải quyết vấn đề. Nếu tôi muốn biết loại ở phía khách hàng, bằng cách chia sẻ thư viện lớp của các hợp đồng?

+4

Tôi ước tôi biết câu trả lời cho điều này. Tôi đang chiến đấu với một vấn đề gần như giống hệt với VS2010 ngay bây giờ. Theo kinh nghiệm của tôi, WCF đã không ổn định và không đáng tin cậy trong nhiều năm khi nói đến việc tạo ra WSDL thích hợp cho tiêu thụ trong svcutil.exe, và nó khá đáng thất vọng vì nó chưa được sửa trong VS2010. Không ai ở Microsoft thực sự sử dụng công nghệ này? Bởi vì tôi không thể thiết lập một dịch vụ WCF mà không chạy vào này hoặc một số vấn đề liên quan chặt chẽ khác. –

+1

MICROSOFT XIN VUI LÒNG THỰC HIỆN NÀY !!! (hoặc tôi đi Java) – capdragon

Trả lời

0

Loại ngoại lệ này thường có nghĩa là có ít nhất một sự khác biệt trong các loại hợp đồng do dịch vụ tạo ra so với các loại được tham chiếu (như thông báo cho biết!). Nhưng nó có thể không được rõ ràng ở cái nhìn đầu tiên, như tôi phát hiện ra. Đảm bảo tất cả các loại lồng nhau và tham chiếu đều được cập nhật với máy chủ. Trong trường hợp của tôi, các kiểu lồng nhau đã được cập nhật trên máy chủ. Tôi nghĩ rằng tôi đã cập nhật bởi hội đồng tham chiếu tại địa phương (và các loại tham chiếu được chia sẻ) nhưng tôi đã bỏ lỡ một số. Phải kiểm tra chặt chẽ để tìm ra thủ phạm.

Xem thêm chi tiết tại this question

0

Tôi có một đề nghị:
Tôi có lỗi tương tự, bao gồm:

the .svcmap file cannot be found. It may have been moved or deleted. To generate a new .svcmap file, delete the service reference and add it again.

Và vào thời điểm đó, không có cách nào để xóa các tài liệu tham khảo dịch vụ trừ khi tôi đóng VS2010 và mở lại.

Tình hình là: dịch vụ WCF của tôi đang chạy, tôi lập trình thêm Description.ServiceMetadataBehavior tại địa chỉ HTTP mà tôi xác định.

Trong VS2010, tôi cố gắng thêm tham chiếu dịch vụ tại địa chỉ HTTP, tôi thấy dịch vụ của mình, tôi thêm tham chiếu và thông báo, lỗi và cảnh báo.

Sự cố: địa chỉ HTTP của tôi chứa một số từ khóa mà WCF không thích. Cụ thể là từ COM (nó cũng vi phạm với LPT).

Vì vậy, giải pháp của tôi: sửa đổi địa chỉ HTTP của tôi không có từ COM. Nó làm việc cho tôi.

0

Nếu dịch vụ được lưu trữ trên HTTPS, hãy truy cập Trình quản lý IIS của máy chủ. Trong "Cài đặt SSL" cho trang web, hãy đảm bảo chọn "Yêu cầu SSL" và kiểm tra nút radio Chứng chỉ ứng dụng khách để "Chấp nhận".

Các vấn đề liên quan