2012-11-29 31 views
21

Tôi có dịch vụ web WCF và trình khách javascript kết nối với dịch vụ này qua AJAX bằng cách sử dụng SOAP 1.2. Những gì tôi muốn làm là để vượt qua một số tham số để nói cho AJAX SOAP gọi chỉ sử dụng một proxy giống như tôi thực hiện trong WCF Test Client bằng cách bỏ chọn "Bắt đầu proxy mới". imageCách sử dụng một proxy trong AJAX javascript bằng cách sử dụng SOAP giống như WCF Test Client sử dụng

Và đây là SOAP gọi AJAX của tôi:

DoSoapAjax: function (soapMethodName, data, successHandler, errorHandler, isAsync, currentInstance) { 
    var service = this; 
    var soapResult = soapMethodName + "Result"; 
    var soap12WithWsHttpBindRequest ='<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">' + 
         '<s:Header>' + 
         '<a:Action s:mustUnderstand="1">' + this.serviceContractNamespace + '/' + this.interfaceName + '/' + soapMethodName + '</a:Action>' + 
         '<a:MessageID>urn:uuid:605ea0c6-d09b-46bf-b61d-e61b377a135b</a:MessageID>' + 
         '<a:ReplyTo>' + 
         '<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>' + 
         '</a:ReplyTo>' + 
         '<a:To s:mustUnderstand="1">' + this.tenantAdminService + '</a:To>' + 
         '</s:Header>' + 
         '<s:Body>'; 
         if (data == emptyString) 
         { 
         soap12WithWsHttpBindRequest += 
         '<' + soapMethodName + ' xmlns="' + this.serviceContractNamespace + '" />'; 
         } 
         else 
         { 
         soap12WithWsHttpBindRequest += 
         '<' + soapMethodName + ' xmlns="' + this.serviceContractNamespace + '">' + 
         data + 
         '</' + soapMethodName + '>'; 
         } 
         soap12WithWsHttpBindRequest += 
         '</s:Body>' + 
         '</s:Envelope>'; 
    // in order for ajax to work on jQuery 1.8.2 we need to enable the following. 
    // found this answer on the link : http://stackoverflow.com/questions/9160123/no-transport-error-w-jquery-ajax-call-in-ie 
    $.support.cors = true; 
    // variable to save successData 
    var responseData = null; 
    // SOAP 1.2 query 
    var response = $.ajax({ 
       type: "POST", 
       url: this.tenantAdminService, 
       data: soap12WithWsHttpBindRequest, 
       contentType: "application/soap+xml", 
       dataType: "xml", 
       processData: false, 
       async: isAsync, 
       success: function (data, status, xmlHttpRequest) { 
       responseData = data; 
       // inserting all data results into dictionary 
       var responseResults = {}; 
       // delegating success function 
       if (successHandler != null) 
       { 
        responseResults = service.ParseResponse(soapMethodName, data); 
        successHandler(responseResults, currentInstance); 
       }     
       }, 
       error: function (xmlHttpRequest, textStatus, errorThrown) { 
        if (errorHandler != null) 
        { 
        errorHandler(xmlHttpRequest, textStatus, errorThrown, currentInstance); 
        } 
        else if (!isAsync) 
        { 
        alert("Error : " + errorThrown); 
        alert("Error Description : " + xmlHttpRequest.responseText); 
        } 

        return; 
       } 
      }); 

     if (!isAsync) 
     { 
      return service.ParseResponse(soapMethodName, response.responseXML); 
     } 
    } 
+0

Đây có phải là máy chủ của riêng bạn hoặc dịch vụ SOAP của bên thứ 3 không? Tôi tự hỏi vì các vấn đề của trang web chéo nếu bạn đang có khách hàng thực sự đăng xml thông qua chức năng này cho bên thứ ba SOAP ws. Tôi tin rằng hầu hết các trình duyệt sẽ không cho phép bạn đăng xml lên bên thứ ba trực tiếp qua js từ trang web gốc của bạn. Từ màn hình wcf của bạn, tôi lấy nó là nội bộ. Vì vậy, bạn có ý nghĩa gì bởi proxy sau đó cho mỗi trình duyệt của khách hàng? – williambq

+0

@williambq Cảm ơn bạn đã bình luận. Đây là máy chủ của riêng tôi.không phải là bên thứ ba. – liorafar

+2

Vì vậy, tôi nghĩ rằng bạn đang cố gắng để có được một proxy singleton tại chỗ? Vì vậy, mỗi yêu cầu tạo ra một thể hiện mới của proxy khi được gọi? – williambq

Trả lời

1

Tôi sẽ bắt đầu bằng cách nói rằng tôi không biết câu trả lời cụ thể cho điều này, nhưng cách tiếp cận của tôi sẽ là để sniff lưu lượng từ WFC của bạn Kiểm tra Máy khách để xem liệu nó có đang thêm bất kỳ tham số nào vào cuộc gọi mà bạn có thể thêm vào tiêu đề yêu cầu của bạn trong cuộc gọi AJAX của bạn hay không.

Fiddler có thể thực hiện công việc mặc dù tôi không chắc chắn nó sẽ bắt tất cả lưu lượng truy cập http - chủ yếu là nó hướng đến trình duyệt. Có những công cụ khác có ít hoặc nhiều khả năng và dễ sử dụng, như dây cá mập, ether, v.v.

Tôi đoán có một số tham số yêu cầu khác bên ngoài phần thân phong bì SOAP được truyền từ ứng dụng khách thử nghiệm mà bạn có thể thấy. Đó là cách duy nhất tôi có thể tưởng tượng khách hàng thử nghiệm sẽ có thể giao tiếp điều này mà không cần sửa đổi thông điệp SOAP của bạn.

Nếu bạn có thể tìm thấy tên và giá trị, bạn có thể thêm tên và giá trị vào dữ liệu của mình: tham số dưới dạng thực thể JSON giá trị tên khác.

0

liorafar: Tôi cho rằng bạn đang chạy Javascript từ trình duyệt khi máy chủ lưu trữ. Nếu không, trừ khi bạn cho phép javascript thay đổi một số hành vi của máy chủ lưu trữ của bạn mà là với khách hàng aproval cho mọi cuộc truy tố mà trình duyệt xác định là nguy cơ bảo mật. Hãy xem xét rằng: 1) Javascript không kiểm soát cấu hình kết nối, nó chỉ sử dụng môi trường được cung cấp bởi máy chủ đang chạy, trong trường hợp này là trình duyệt nhưng cũng có thể ở phía máy chủ. 2) Trong trường hợp bạn nói "ok, hãy ép buộc điều này", cách duy nhất nó đến với tâm trí của tôi là tạo một thể hiện của máy chủ của bạn hoặc bất kỳ đối tượng nào của máy khách và buộc thay đổi kết nối ... thời điểm trình duyệt sẽ phát hiện javascript của bạn như là một nguy cơ bảo mật và bạn nên tạo một kịch bản cho mọi trình duyệt trên thị trường, bởi vì mọi người đều có cách xử lý ... tin tốt duy nhất về điều này là với IE bạn có thể thay đổi cấu hình cho Chrome nữa !!

Những gì tôi sẽ làm để giải quyết vấn đề này là yêu cầu mọi người cấu hình trình duyệt với một số quy tắc ngoại trừ proxy trong trình duyệt (nếu bạn tham gia công ty).

Tôi hy vọng điều này có thể giúp theo cách này hay cách khác !!

Gabriel

0

Bạn có thể đặt yêu cầu xà phòng trong Fiddler và sau đó thực hiện, bạn sẽ nhận được phản hồi. Đối với loại phản hồi đó. Khi bạn nhận được phản hồi, hãy xem nó ở chế độ bạn muốn.

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