2010-05-14 9 views
8

Przede wszystkim, moje pytanie jest podobna do this oneZmień URL serwis internetowy dla klienta mydlin na starcie (utrzymanie WSDL)

Ale to trochę inaczej. Mamy szereg środowisk z tym samym zestawem usług. Dla niektórych środowisk (lokalnych) możemy uzyskać dostęp do pliku wsdl, a tym samym wygenerować klienta suds. W przypadku środowiska zewnętrznego nie możemy uzyskać dostępu do pliku wsdl. Ale będąc tym samym, miałem nadzieję, że mogę zmienić tylko URL bez regeneracji klienta. Próbowałem już klonowania klienta, ale to nie działa.


Edycja: Kod dodając:

host='http://.../MyService.svc' 
    wsdl_file = 'file://..../wsdl/MyService.wsdl' 

    client = suds.client.Client(wsdl_file, location=host, cache=None) 

    #client = baseclient.clone() 

    #client.options.location = otherhost 

    client.set_options(port='BasicHttpBinding_IMyService') 

    result = client.service.IsHealthy() 

To daje mi ten wyjątek:

Komunikat z działania „http://tempuri.org/IMyService/IsHealthy” nie mogą być przetwarzane w odbiorniku ze względu na niedopasowanie ContractFilter Pod EndpointDispatcher. Może to być spowodowane niedopasowaniem umowy (niedopasowane działania między nadawcą a odbiorcą) lub niedopasowaniem powiązania/bezpieczeństwa między nadawcą a odbiorcą. Sprawdź, czy nadawca i odbiorca mają tę samą umowę i to samo wiązanie (w tym wymogi bezpieczeństwa, np. Wiadomość, transport, brak).

Rzeczą jest, jeśli ustawić klienta bezpośrednio do hosta, to działa dobrze: client = suds.client.Client (host)

Jak widać, próbowałem klonowania klienta, ale z tym samym wyjątkiem. Próbowałem nawet tego:

baseclient = suds.client.Client(host) 

    client = baseclient.clone() 

    client.options.location = otherhost 
    .... 

I dostałem ten sam wyjątek.

Ktoś może mi pomóc?

Odpowiedz

0

Możesz to zrobić, podając location usługi. Zakładając, że masz obiekt o nazwie Client o nazwie client, możesz zmodyfikować lokalizację usługi, aktualizując adres URL pod numerem client.options.location.

Dodatkowo można użyć lokalnej kopii pliku WSDL jako url podczas konstruowania klienta przy użyciu schematu file:// dla adresu URL, np. file:///path/to/service.wsdl. To może być dla ciebie inna opcja. Oczywiście należy również podać wartość location, aby domyślna lokalizacja z pliku WSDL została nadpisana.

+0

Próbowałem wielu rzeczy, ale nie mogę zrozumieć, co robię źle. Dodam kod do oryginalnego pytania. Byłoby wspaniale, gdybyś mógł to sprawdzić. – patanpatan

+0

Mój problem polega na tym, że usługodawca daje ci plik. W trybie testowym należy ręcznie zmodyfikować plik WSDL za pomocą testowego adresu URL. Chciałem dokonać zmiany dynamicznie po załadowaniu pliku i aktualizacji lokalizacji adresu usługi. Nie sądzę, że to możliwe. – radtek

3

Mam to !. ja nawet nie wiem, jak mam zorientowaliśmy się, ale z trochę zgadywać i dużo szczęścia, że ​​skończyło się tak:

wsdl_file = 'file://...../MyService.wsdl' 

    client = suds.client.Client(wsdl_file) 
    client.wsdl.url = host #this line did the trick 

    client.set_options(port='BasicHttpBinding_IMyService') 

    result = client.service.IsHealthy() 

I to działa! Nie mogę znaleźć żadnej dokumentacji dotyczącej tej właściwości (client.wsdl.url), ale działa, więc opublikuję ją na wypadek, gdyby ktoś miał ten sam problem.

+0

argh! Właśnie otrzymywał adres URL z pliku. Ustawienie client.wsdl.url zostało zmodyfikowane, ale nadal przechodzi do pierwotnej usługi. – patanpatan

+0

Czy to działa? Jeśli nie, być może połączenie 'client.wsdl.url' i' client.options.location'? To zaczyna być czuć się hacky, być może lista mailingowa SUDS byłaby bardziej pomocna? – jathanism

4
client.sd[0].service.setlocation(new_url) 

... jest metodą "ręczną", tj. per service-description.

client.set_option(new_url) 

... powinien również działać, per the author.

optionsis a wrapped/protected attr - bezpośrednie modyfikacje mogą zostać zignorowane.

+0

Niektóre wyjaśnienia lub link do dokumentacji sprawiają, że twoja odpowiedź jest o wiele bardziej wartościowa. – Jacco

+0

wystarczająco fair; rozszerzony – anthonyrisinger

Powiązane problemy