2016-12-05 3 views
1

Okey so nach 3 Stunden für die Suche und versuchen, verschiedene Möglichkeiten, ich habe nicht mehr eine Ahnung, wie diese zu lösen ...Externe Webservice „Interner Fehler“

Die Situation:
Unsere bundesweite Paketlieferanten (Die Post) bietet einen Webservice zur Überprüfung, ob eine Adresse existiert. Ich kontaktierte sie, erhielt Benutzername und Passwort für die Anwendung sowie die .wsdl-Datei.
Ich habe einen Service-Verweis auf die heruntergeladene Datei erstellt und kann die Klassen ohne Probleme verwenden.

Nun das Problem:
Wir haben 2 weitere Webdiensten, die die vorherige programer mit Authentifizierung und alles eingerichtet, ich kopieren Sie einfach den Code aus einem der Dienste geklebt und alles rund um aktuelle gesetzt, aber wenn ich versuche, Um eine Antwort zu erhalten, erhalte ich immer einen Fehler (Interner Fehler), ohne weitere Informationen.
fand ich einen Weg, um die letzte Anforderung und den einzigen Unterschied von der Anfrage zu dem in der SoapUI (was perfekt funktioniert gut) zu bekommen, ist, dass anstelle von „<soapenv:Header/>“ es
<s:Header> <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://post.ch/AdressCheckerExtern/V4-01-00</Action> </s:Header>

Der aktuelle Code ist ist:

// Create Request 
PostAdressChecker.AdressCheckerRequestType adrRequest = new PostAdressChecker.AdressCheckerRequestType() 
{ 
    Street = strStrasse, 
    HouseNbr = strHausnummer, 
    Zip = strPlz, 
    Town = strOrt, 
    Params = new PostAdressChecker.AdressCheckerRequestTypeParams() 
    { 
     CallUser = "TU_99660_0001", 
     SearchLanguage = "1", 
     MaxRows = "10", 
     SearchType = "10" 
    } 
}; 

BasicHttpBinding basicBinding = new BasicHttpBinding(BasicHttpSecurityMode.Transport) 
{ 
    ReaderQuotas = { MaxStringContentLength = int.MaxValue }, 
    MaxReceivedMessageSize = int.MaxValue, 
    SendTimeout = new TimeSpan(0, 2, 0) 
}; 

PostAdressChecker.ACHePortTypeClient client; 
client = new PostAdressChecker.ACHePortTypeClient(basicBinding, new EndpointAddress(strUrl)); 
client.Endpoint.Behaviors.Add(new PostSigningEndpointBehavior(strUsername, strPassword));    
SoapTracer RequestInterceptor = new SoapTracer(); 
client.Endpoint.Behaviors.Add(RequestInterceptor); 

try 
{ 
    PostAdressChecker.AdressCheckerResponseType adrResponse = client.AdrCheckerExterne(adrRequest); 
} 
catch (Exception ex) 
{ 
    strError = ex.ToString(); 
} 

Hat jemand eine Idee, wie man dieses debuggt/löst? Vielen Dank und beste Grüße

Antwort

0

in Perl Ich mache es so. Vielleicht kann dies Sie Inspiration geben ...

sub clientFactory { 
    my $wsdl = XML::Compile::WSDL11->new('etc/adrCheckerExterne-V4-01-00.wsdl'); 
    $wsdl->importDefinitions('etc/adrCheckerExterne-V4-01-00.xsd'); 
    $wsdl->importDefinitions('etc/adrCheckerTypes-V4-01-00.xsd'); 
    my $basic_auth = sub { 
     my ($request, $trace) = @_; 
     my $authorization = 'Basic '. 
      b64_encode "$adrCheckerUser:$adrCheckerPassword"; 
     $request->header(Authorization => $authorization); 
     my $ua = $trace->{user_agent}; 
     $ua->request($request); 
    }; 
    return $wsdl->compileClient(
     'AdrCheckerExterne', 
     transport_hook => $basic_auth, 
     aync => 1, 
    ); 
}; 

my $client = clientFactory; 

my $check = $client->(
    Params => { 
     MaxRows => 100, 
     CallUser => $adrCheckerUser, 
     SearchLanguage => 1, 
     SearchType => 1 
    }, 
    FirstName => $first_name, 
    Name => ${last_name}, 
    Street => ${street}, 
    HouseNbr => ${nr}, 
    Zip => ${zip}, 
    Town => ${town}, 
    HouseKey => 0, 
    PboxAddress => 0, 
); 
0

Sie müssen HouseKey = 0 zu Ihrem adrRequest hinzuzufügen. Dies ist eine erforderliche Eingabe - Sie können es einfach auf 0 setzen, wenn Sie es nicht wissen. Andernfalls gibt der Dienst einen Fehler zurück.