2009-03-13 20 views
20

Tôi đã gặp sự cố khi gọi dịch vụ web trên xe buýt SAP PI từ máy khách WCF của tôi. Hoạt động được định nghĩa là một chiều và phương thức trên hợp đồng hoạt động proxy của tôi được trang trí phù hợp khi tham chiếu dịch vụ được thêm vào. Tuy nhiên, khách hàng dịch vụ được một ngoại lệ khi gọi các hoạt động theo:Vấn đề với khách hàng WCF gọi hoạt động một chiều

Các hoạt động một chiều trở lại một thông điệp không null với Action = ''

Sử dụng soapUI, phương pháp trên bus có thể được gọi thành công, và nó trả về một phong bì SOAP với một thân trống. Những người xe buýt nói với tôi, đây là theo thông số kỹ thuật SOAP:


(thông số kỹ thuật SOAP, chương 4.7.9, hoạt động một chiều):

Có khác nhau giải thích về cách thức HTTP là phải được sử dụng khi thực hiện các hoạt động một chiều.

R2714 Đối với các thao tác một chiều, CÀI ĐẶT KHÔNG PHẢI trả về phản hồi HTTP có chứa phong bì. Cụ thể, nội dung của đối tượng phản hồi HTTP phải trống.

R2750 NGƯỜI TIÊU DÙNG PHẢI bỏ qua một phong bì được mang trong thông báo phản hồi HTTP trong thao tác một chiều.

R2727 Đối với hoạt động một chiều, một người tiêu dùng phải KHÔNG giải thích một phản ứng HTTP mã trạng thái thành công (ví dụ: 2xx) có nghĩa là thông điệp có giá trị hay rằng người nhận sẽ xử lý nó.


Vì vậy, có vẻ như, khách hàng WCF của tôi không tuân thủ R2750.

Tôi đã phát hiện ra rằng khi tôi buộc hợp đồng hoạt động trên proxy phải là IsOneWay = false, mọi thứ đều hoạt động.

Có điều gì sai với cách WCF xử lý các hoạt động một cách hoặc tôi làm điều gì đó sai (nhiều khả năng)? Có điều gì khác tôi nên làm, nó chỉ có vẻ không đúng để ghi đè lên khách hàng proxy WCF tạo ra.

Cảm ơn mọi đề xuất.

+2

Câu hỏi tuyệt vời +1. Tôi cho rằng phe của họ cũng không tuân theo R2714. Hãy xem xét việc gửi một sự cố với Microsoft và cho chúng tôi biết kết quả là gì. –

+0

Câu hỏi tương tự (và biết thêm thông tin): http://stackoverflow.com/q/4510484/46039 –

+0

Liên kết với thông số SOAP 4.7.9 Hoạt động một chiều: http://www.ws-i.org/profiles/basicprofile -1.1.html –

Trả lời

11

Có vẻ như SAP PI không chính xác gửi một phong bì SOAP trống và .NET giải thích không chính xác phong bì đó.

Một số tùy chọn từ this thread:

  • thay đổi proxy được tạo ra và loại bỏ OneWay = true (hoặc thêm OneWay = false) để định nghĩa phương pháp
  • bắt các vi phạm Nghị định thư trong một trình xử lý ngoại lệ và bỏ qua nó
  • sử dụng một webreference 2.0 phong cách gọi cho dịch vụ
  • áp dụng SAP vá Note 1459995 - Soap Sender Adapter HTTP 202 và thêm & responsecode202 = true vào url

Tùy chọn đầu tiên và cuối cùng đều phù hợp với tôi. Thảo luận thêm về điều này sap.com thread.

+0

Cảm ơn vì điều này, nó vẫn có liên quan đến tôi. –

+0

Đây là câu trả lời, cảm ơn sự giúp đỡ! – SDeezy

+0

Tôi nghĩ rằng từ góc độ hệ thống, một cuộc gọi dịch vụ web phải luôn trả lời với xác nhận. Đúng hay sai, 1 hoặc 0 để cho biết thư của bạn đã được nhận và xử lý từ phía bên kia. –

4

Tôi cũng sẽ xem bài viết này của Gerben van Loon here. Một cách hoạt động có thể không thực sự là một cách theo tiêu chuẩn.

+0

Cảm ơn bạn đã liên kết này –

+1

Ngữ nghĩa của các cuộc gọi web trực tuyến trên 'SOAP' có thể so sánh với' void() 'không cháy và quên. Giống như một phương thức trả về 'void()' lời gọi đang chặn và không có khả năng "trả về" một ngoại lệ. –

0

Tôi tin rằng vấn đề cụ thể này có thể được cố định bằng cách thêm phần khai báo thuộc tính sau đây để hoạt động trong porxy khách hàng:

[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)]

+0

Cảm ơn câu trả lời của bạn. Tuy nhiên việc bổ sung này vào proxy client được tạo giống như việc thiết lập thuộc tính OneWay thành false. Và tiếc là nó không hoạt động. –

0

Nếu không nhìn thấy những gì mà chữ ký của phương pháp này có vẻ như, đoán tốt nhất của tôi là phương thức của bạn được định nghĩa để trả về một thứ khác ngoài "void". Vì thao tác là một chiều, phương thức này chỉ có thể được xác định bằng cách sử dụng "void" (không có trả lại). Bất cứ điều gì khác, và hoạt động không phải là một chiều.

+0

Phương thức thực sự trả về void –

1

Kiểm tra SAP của Chủ đề này ra cho các thảo luận đầy đủ: http://scn.sap.com/thread/1627368

@ Brian Low đã trả lời câu hỏi này một cách chính xác và rất triệt để (được nên được đánh dấu là câu trả lời). Tôi cũng muốn nói thêm rằng đây là một lỗi đã biết trong đó Bộ điều hợp SOAP không tuân theo WS-I Basic Profile 1.1 (R2750) nói trên và WCF không tuân thủ (R2750). Kết quả ... Số giờ lãng phí và nghiến răng ...

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