2012-11-29 7 views
21

Mam usługa WWW WCF i JavaScript klient, który łączy się z tej usługi za pośrednictwem AJAX przy użyciu protokołu SOAP 1.2. Co chcę zrobić, to przekazać pewien parametr, aby powiadomić wywołanie SOAP AJAX do używać tylko jednego proxy tak samo jak robię to w kliencie testowym WCF, odznaczając "Uruchom nowy serwer proxy". imageJak używać jednego pełnomocnika w javascript AJAX używając mydła takie same jak WCF test Klienta używać

A to moja SOAP AJAX wywołanie:

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

Czy jest to usługa wysyłana na własny serwer lub do usługi SOAP innej firmy? Zastanawiam się, ze względu na problemy z witryny krzyżowej, jeśli klient rzeczywiście wysłać xml za pośrednictwem tej funkcji do strony zewnętrznej SOAP. Uważam, że większość przeglądarek nie zezwala na publikowanie xml na stronie trzeciej bezpośrednio przez js ze swojej pierwotnej strony internetowej. Z twojego ekranu wcf, biorę to jest wewnętrzne. Co masz na myśli przez proxy, a następnie za klienta przeglądarki? – williambq

+0

@williambq Dzięki za komentarz. To jest mój własny serwer.nie jest stroną trzecią. – liorafar

+2

Więc, myślę, że próbujesz uzyskać proxy singleton w miejscu? Więc każde żądanie tworzy nową instancję proxy po wywołaniu? – williambq

Odpowiedz

1

Zacznę od stwierdzenia, nie wiem konkretną odpowiedź na to pytanie, ale moje podejście byłoby powąchać ruchu z WFC Przetestuj klienta, aby sprawdzić, czy dodaje on parametry do połączenia, które można dodać do nagłówka żądania w wywołaniu AJAX.

Fiddler może wykonać zadanie, chociaż nie jestem pewien, czy wykryje cały ruch http - głównie jest przystosowany do przeglądarek. Istnieją inne narzędzia z większą lub mniejszą zdolność i łatwość użytkowania, jak Wireshark, eter, i tak dalej.

Przypuszczam istnieje jakiś inny parametr żądania poza ciałem koperty SOAP są przesyłane od klienta testowego, który powinien być w stanie zobaczyć. Jest to jedyny sposób, w jaki mogę sobie wyobrazić, że klient testowy byłby w stanie to przekazać bez modyfikowania twojego komunikatu SOAP.

Jeśli można znaleźć nazwę i wartość, można go dodać do danych: parametr jako inny podmiot JSON nazwa-wartość.

0

liorafar: Zakładam używasz Javascript w przeglądarce, jak to gospodarz. Jeśli tak, to nie jest możliwe, chyba że zezwolisz javascriptowi na pewne zachowanie twojego hosta, które jest z klientami, aprowizuje do każdego egzekucji, które przeglądarka identyfikuje jako zagrożenie bezpieczeństwa. Należy wziąć pod uwagę, że: 1) Javascript nie przejmuje kontroli nad konfiguracją połączenia, korzysta tylko ze środowiska udostępnianego przez hosta, na którym działa, w tym przypadku przeglądarki, ale może również znajdować się po stronie serwera. 2) Jeśli powiesz "ok, zmusimy to", jedyny sposób, w jaki przychodzi mi na myśl, to utworzenie instancji hosta lub dowolnego obiektu hosta klienta i wymuszenie zmiany połączenia ... i przez to w momencie, gdy przeglądarka wykryje Twój javascript jako zagrożenie bezpieczeństwa i powinieneś stworzyć skrypt dla każdej przeglądarki na rynku, ponieważ każdy ma sposób na poradzenie sobie z tym ... jedyną dobrą wiadomością jest to, że dzięki IE możesz zmienić konfiguracja dla Chrome też !!

To, co zrobię, aby rozwiązać ten problem, to poprosić informatyków o skonfigurowanie przeglądarek z pewną regułą exceptino przez proxy w przeglądarkach (jeśli jesteś w firmie).

Mam nadzieję, że to może pomóc w taki czy inny sposób!

Gabriel

0

Możesz umieścić swoją prośbę mydła w Fiddler i następnie wykonać dostaniesz odpowiedź. Dla tego typu odpowiedzi. Kiedy otrzymasz odpowiedź, przejrzyj ją w żądanym trybie.

Powiązane problemy