2010-03-03 37 views
15

Khi tôi nhập một dịch vụ nhất định bằng cách sử dụng "Thêm dịch vụ tham khảo" trên Visual Studio 2008 (SP1) tất cả các thông điệp yêu cầu/phản hồi đang được đặt không cần thiết vào các hợp đồng tin nhắn (có tên -> "operationName "+" Yêu cầu "/" Phản hồi "+" 1 "ở cuối).Thêm tham chiếu dịch vụ tạo hợp đồng tin nhắn

Các bộ tạo mã nói:

// CODEGEN: Generating message contract since the operation XXX is neither RPC nor 
// document wrapped. 

Các anh chàng đang tạo ra WSDL từ một dịch vụ Java cho biết họ đang xác định TÀI LIỆU-đen/bọc.

Bất kỳ trợ giúp/con trỏ/đầu mối nào sẽ được đánh giá cao.

Cập nhật: đây là mẫu wsdl của tôi cho một trong các thao tác có vẻ đáng ngờ. Lưu ý sự không khớp trên thuộc tính phần tử thư cho yêu cầu, so với phản hồi.

<!- imports namespaces and defines elements --> 
<wsdl:types> 
    <xsd:schema targetNamespace="http://WHATEVER/" xmlns:xsd_1="http://WHATEVER_1/" xmlns:xsd_2="http://WHATEVER_2/"> 
     <xsd:import namespace="http://WHATEVER_1/" schemaLocation="WHATEVER_1.xsd"/> 
     <xsd:import namespace="http://WHATEVER_2/" schemaLocation="WHATEVER_2.xsd"/> 
     <xsd:element name="myOperationResponse" type="xsd_1:MyOperationResponse"/> 
     <xsd:element name="myOperation" type="xsd_1:MyOperationRequest"/> 
    </xsd:schema> 
</wsdl:types> 

<!- declares messages - NOTE the mismatch on the request element attribute compared to response --> 
<wsdl:message name="myOperationRequest"> 
    <wsdl:part element="tns:myOperation" name="request"/> 
</wsdl:message> 
<wsdl:message name="myOperationResponse"> 
    <wsdl:part element="tns:myOperationResponse" name="response"/> 
</wsdl:message> 

<!- operations --> 
<wsdl:portType name="MyService"> 
    <wsdl:operation name="myOperation"> 
     <wsdl:input message="tns:myOperationRequest"/> 
     <wsdl:output message="tns:myOperationResponse"/> 
     <wsdl:fault message="tns:myOperationFault" name="myOperationFault"/> 
     <wsdl:fault message="tns:myOperationFault1" name="myOperationFault1"/> 
    </wsdl:operation> 
</wsdl:portType> 

Cập nhật 2: Tôi kéo tất cả các loại mà tôi đã có trong namespace nhập khẩu của tôi (họ trong một xsd riêng) vào wsdl, như tôi nghi ngờ việc nhập khẩu có thể được kích hoạt các thế hệ đồng tin nhắn. Trước sự ngạc nhiên của tôi, nó không phải là trường hợp và có tất cả các loại được định nghĩa trong wsdl đã không thay đổi bất cứ điều gì.

Tôi sau đó (tuyệt vọng) bắt đầu xây dựng wsdls từ đầu và chơi với thuộc tính phần tử trong thuộc tính chuỗi tôi đã có thể tạo lại hành vi tạo hợp đồng thư không mong muốn.

Dưới đây là một ví dụ của một phần tử:

<xsd:element name="myElement"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element minOccurs="0" maxOccurs="1" name="arg1" type="xsd:string"/> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:element> 

Chơi với maxOccurs trên các yếu tố được sử dụng như tin nhắn (tất cả các yêu cầu và đáp ứng về cơ bản) sau đây sẽ xảy ra:

  • maxOccurs = "1" không kích hoạt gói
  • macOcccurs> 1 kích hoạt gói
  • maxOccurs = "vô biên" kích hoạt gói

Tôi đã không thể tái sản xuất này trên wsdl sản xuất của tôi chưa vì làm tổ của các loại đi rất sâu, và nó sẽ đưa tôi thời gian để kiểm tra nó kỹ lưỡng. Trong khi đó tôi hy vọng nó có thể rung chuông - bất kỳ sự trợ giúp nào được đánh giá cao.

+0

cũng lưu ý - rằng tôi nhận được lỗi đó trên tất cả các thao tác không chỉ trên một tính năng cụ thể. Tôi dường như hiểu điều này có thể là do một lỗi trên BẤT CỨ của các định nghĩa loại được sử dụng bởi BẤT CỨ của các hoạt động, điều này sẽ gây ra DataContractSerialer được thay thế bởi XmlSerializer, do đó các MEssageContracts. Liệu sự giải thích này có ý nghĩa gì không? – JohnIdol

Trả lời

1

Bạn có thử sử dụng scvutil Chuyển đến -> Startmenu/Visual Studio 2008/Tools/VS Command Prompt

Loại svcutil, sau đó kiểm tra các thông số, đặc biệt là/bọc tham số.Cuối cùng sử dụng này để tạo proxy của bạn, nó mang lại cho bạn điều khiển rất nhiều nhiều hơn whats going on

+0

Tôi đã thử với svcutil và có cùng một vấn đề nhưng không chơi với tham số/wrapper - sẽ kiểm tra xem ra – JohnIdol

4

Dưới đây là item khác để kiểm tra:

  1. Nhấp chuột phải vào tài liệu tham khảo dịch vụ của bạn trong Solution Explorer và chọn 'Configure Tham chiếu dịch vụ '

  2. Kiểm tra xem có chọn' Luôn tạo hợp đồng tin nhắn 'hay không.

+0

đã đến đó chưa - hộp đó chưa được kiểm tra, nhưng gợi ý tốt! :) – JohnIdol

+1

Đã làm cho các trick cho tôi. Cảm ơn! –

2

Trong khi tôi biết đây là một mục dài ra ngày tháng, đối với những người vấp ngã trên cùng vấn đề này:

kiểm tra cẩn thận xem liệu proxy được tạo ra không chứa bất kỳ mảng lởm chởm, ví dụ

(C#)

private string[][] mystring; 

(VB.NET)

Private myString()() As String 
4

Bạn đã cố gắng thay đổi WSDL để cho mỗi thể hiện của phần element = "tns: myOperation" name = "Yêu cầu ", thay đổi giá trị của thuộc tính name thành 'parameters'.

4

Tôi đã có cùng một vấn đề này và giải pháp này.

Tôi sử dụng này:

<wsdl:message name="Method"> 
     <wsdl:part name="parameters" element="s0:Method"/> 
    </wsdl:message> 

    <wsdl:message name="MethodResponse"> 
     <wsdl:part name="parameters" element="s0:MethodResponse"/> 
    </wsdl:message> 

Thay vì:

<wsdl:message name="Method"> 
     <wsdl:part name="request" element="s0:Method"/> 
    </wsdl:message> 

    <wsdl:message name="MethodResponse"> 
     <wsdl:part name="response" element="s0:MethodResponse"/> 
    </wsdl:message> 

Tôi tin rằng một ai đó đề cập đến nó trước nhưng tôi không thể upvote câu trả lời của họ chưa!

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