2010-12-28 24 views

Trả lời

0

Lý do duy nhất tôi có thể nghĩ là hợp đồng không khớp. Mặc dù nó là lạ nếu không có lỗi xác nhận được ném. Bạn có đang sử dụng một ứng dụng khách được tạo từ WSDL chính xác không? Nó là một khách hàng WCF hoặc một SOAP? Cái trước đây không xác nhận, tôi chắc chắn, nhưng lược đồ không phù hợp có thể trượt qua sau này.

+0

Điều này xảy ra khi tạo lớp proxy từ công cụ wsdl và khi thêm nó làm tham chiếu dịch vụ thông qua GUI VS2010. Đây là một khách hàng SOAP. – Sean

+0

Sử dụng svcutil.exe, không phải wsdl.exe. Hoặc chỉ cần sử dụng "Thêm tham chiếu dịch vụ" và trỏ đến điểm cuối WSDL hoặc siêu dữ liệu. –

+0

Tôi có chính xác cùng một vấn đề như thế này - các không gian tên tôi thấy trong phản hồi WSDL và XML (trong Fiddler) là hoàn toàn giống nhau. Cũng sử dụng đối tượng SOAP. Đối tượng phản hồi là một trình bao bọc đơn giản xung quanh một mảng chung (từ các máy chủ (Java) được chú thích với @XmlElementRefs ({@ XmlElementRef (type = Class1.class, ...}) XML được chuyển tới máy khách C# có vẻ tốt như sau: ... ... ..... C# tạo đối tượng phản hồi nhưng không điền được mảng ... – earcam

4

"Trả lời là không" hoặc "Trả lời chứa null" hoặc "Yêu cầu không có giá trị" hoặc "Yêu cầu chứa null" gần như luôn có nghĩa là bạn có không gian tên không khớp. Ví dụ, phản ứng có thể chứa:

<response xmlns="http://foo.com"/> 

nhưng nên trong thực tế có thể

<response xmlns="http://bar.com"/> 

Trong trường hợp này, null sẽ được nhận.

+0

YES – mikey

0

Mỗi khi điều này xảy ra với tôi, đó là vì tôi cần cập nhật các tham chiếu dịch vụ của mình. Hãy thử điều đó và cho tôi biết điều gì sẽ xảy ra :)

+0

Cảm ơn bạn đã trả lời nhưng tôi tin tưởng, tôi đã xóa và tái tạo khoảng một nghìn lần = ( Tuy nhiên, có thể tôi đang thiếu một thứ gì đó đơn giản hoặc đang tạo ra một sai lầm ngu ngốc ở một nơi khác (ứng dụng C# đầu tiên của tôi) Tôi đã thử với VS 2010 và SharpDevelop, tất cả đều không có ích ... – earcam

+0

Ok, tôi sẽ đánh giá cao vì bạn đã hỏi câu hỏi nếu bạn có thể làm điều đó một lần nữa mặc dù xin vui lòng. I E. cập nhật tham chiếu dịch vụ thay vì xóa và tạo lại. Giả sử rằng không hoạt động, nó sẽ là lý tưởng để xem định nghĩa/hợp đồng cho (các) đối tượng và phương thức liên quan :) –

+0

Tôi đã làm mới trong SharpDevelop và nó giống như trước đây. Khi tôi làm mới tham chiếu WebService trong VS Express 2010, nó đã thay đổi không gian tên C# tiền tố không gian tên mặc định của dự án thành tham chiếu dịch vụ (như DefaultNamespace.ServiceReference). Thực thi từ một trong hai kết quả IDE trong cùng một đối tượng phản hồi với các trường rỗng. – earcam

0

Giải quyết nó ... hoặc ít nhất có giải pháp thay thế. Trong mã Java, @XmlElementRefs và @XmlElementRef phải là @XmlElements và @XmlElement tương ứng (cũng như thuộc tính "type", nó cần thuộc tính "name").

Đoán xem tôi có đăng câu hỏi này như một câu hỏi mới với thẻ Java cũng như C# và dịch vụ web, một số stackoverflower hawk mắt sẽ phát hiện lỗi học sinh này.

0

Tôi gặp sự cố tương tự mà tôi đã giải quyết bằng cách kiểm tra giá trị Đơn đặt hàng trong Reference.cs. [System.Xml.Serialization.XmlElementAttribute (Order = 0)]

Thứ tự của tham số trả về đã thay đổi nhưng cập nhật tham chiếu dịch vụ của tôi trong phòng thu trực quan không thay đổi giá trị "Đặt hàng".

Kiểm tra tham số được trả về trong Fiddler/SoapUI giống như trong lớp được tạo proxy của bạn.

0

Tôi có trường hợp tương tự khi tạo khách hàng qua SVCUTIL/Tham khảo dịch vụ từ VS. Phản hồi đã được nhận thành công với dữ liệu chính xác (được xác nhận thông qua phương thức IClientMessageInspector.AfterReceiveReply) tuy nhiên các giá trị ở cấp đối tượng không được phổ biến. Không có lỗi de-serialization (xác nhận qua sản lượng System.Diagnostics)

Vấn đề là hai khía cạnh:

1) Một số đối tượng đã được đặt tên chính xác như các loại của họ, nhưng có không gian tên khác nhau từ các loại của họ. Điều này dường như đã nhầm lẫn trình tạo proxy trong việc gán tham số không gian tên (trong chú thích System.Xml.Serialization.XmlElementAttribute) của lớp vào một đối tượng

2) Tham số thứ tự (trong System.Xml. Serialization.XmlElementAttribute chú thích) của các thuộc tính không cần thiết và cũng là tham số namespace đã mất tích

như vậy từ: [System.Xml.Serialization.XmlElementAttribute (IsNullable = true, Order = 0)]

cho: [ System.Xml.Serialization.XmlElementAttribute (IsNullable = true, Namespace = "http: //www.whathevernamespaceiscorrect.Vì vậy về cơ bản, trong proxy được tạo, tôi cần sửa chữa không gian tên của lớp thành không gian tên được chỉ định trong loại và thay thế tham số thứ tự bằng tham số không gian tên đặt nó vào không gian tên chính xác theo wsdl

1

tôi đã cùng một vấn đề, và như đề xuất các vấn đề không gian tên là cause.However gốc, lớp proxy của tôi đã lồng các lớp học và chuỗi dài của namespace lồng nhau.

Đó là khó hiểu để xác định không gian tên đúng áp dụng trong mã Cs cho lớp proxy.Tại đây, tôi mô tả cách tìm ra không gian tên cần được cập nhật trong proxy của máy khách.

Những gì tôi đã làm là chặn yêu cầu trong lớp ClientMessageInspector, phương thức AfterReceiveReply (Cho phép kiểm tra hoặc sửa đổi thông báo sau khi nhận được một tin nhắn trả lời nhưng trước khi chuyển nó trở lại ứng dụng khách.) Đã xác minh không gian tên của đối tượng trả về null trong phản hồi bằng cách sử dụng XMLDocument. Tôi đã cập nhật lớp proxy với không gian tên được truy xuất từ ​​XML. Sau khi thực hiện các thay đổi, các đối tượng không được trả về null.

public class MyMessageInspector : IClientMessageInspector 
{ 
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message request, object correlationState) 
    { 

     MemoryStream ms = new MemoryStream(); 
     XmlWriter writer = XmlWriter.Create(ms); 
     request.WriteMessage(writer); 

     writer.Flush(); 
     ms.Position = 0; 
     XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(ms); 
     this.ReadMessage(xmlDoc); 


     ms = new MemoryStream(); 
     xmlDoc.Save(ms); 
     ms.Position = 0; 
     XmlReader reader = XmlReader.Create(ms); 
     Message newMessage = Message.CreateMessage(reader, int.MaxValue, request.Version); 
     newMessage.Properties.CopyProperties(request.Properties); 
     request = newMessage; 

    } 

    private void ReadMessage(XmlDocument xmlDoc) 
    { 
     XmlNode v1 = xmlDoc.GetElementsByTagName("XPAth"); 
     //Actual Namespace in XML, which should be used in Proxy Class 
     string namespaceURIForObjectInXML = v1.NamespaceURI; 
    } 

    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel) 
    { 

    } 



} 
0

Đảm bảo định nghĩa/đặc điểm kỹ thuật khớp với đầu ra. So sánh WSDL (trong trình duyệt) và phản hồi (trong SOAP-UI, Fiddler), ví dụ:

  • WSDL sử dụng trường hợp lạc đà (lastName) và
  • phản ứng sử dụng dấu gạch dưới (last_name).
Các vấn đề liên quan