2016-07-28 7 views
1

Ich versuche, meine Rails-App mit einem Sql Server Reports Services (SSRS) mit Savon 2.11.1 zu integrieren. Ich verwende die WSDL von ReportServicesExecution2005. Das Problem, das ich habe, ist, dass ich eine Session-ID dem Soap-Header hinzufügen muss, nachdem der Client instanziiert wurde. Dies liegt daran, dass die session_id von SSRS generiert wird, nachdem der Client einen Aufruf von load_report durchgeführt hat.Savon 2.11.1 Set Soap-Header nach Client instanziiert Rails + SSRS

client = Savon.client(wsdl: "https://somewsdl.asmx?wsdl", basic_auth: ["user", "pass"]) 

dieser Aufruf gibt die session_id in der Antwort:

response = client.call(:load_report, message: {report: "path/to/report"}) 

die Seife Kopf die session_id in dem Client enthalten muss, wenn dieser Anruf getätigt wird:

client.call(:set_execution_parameters, message: { report: "path/to/report", parameters: params } ) 

versucht, dies aber es hat nicht funktioniert:

client.call(:set_execution_parameters, soap_header: {"session_id" => @session_id}, message: { report: "path/to/report", parameters: params } ) 

bekomme ich folgende Fehlermeldung:

(soap:Client) The session identifier is missing. A session identifier is required for this operation. ---> Microsoft.ReportingServices.Diagnostics.Utilities.MissingSessionIdException: The session identifier is missing. A session identifier is required for this operation.

Danke für die Hilfe ein Fortschritt.

Antwort

0

Die Lösung I (während klobig) passieren fand, war eine neue Client über Savon und übergeben Sie die vorhandenen Client-Werte zu schaffen und die neue execution_id/session_Id im Konstruktor. Das hat den Trick gemacht. Codebeispiel unten.

Initial Savon Auftraggeber:

@exeClient = Savon.client(wsdl: "some_wsdl.asmx?wsdl", basic_auth: ["user", "pass"], 
convert_request_keys_to: :camelcase, soap_header: {"execution_id" => ""}) 

Anruf load_report erhalten execution_id:

@data = @exeClient.call(:load_report, message: {report: "/path/to/report"}) 

Zugang execution_id:

@report = @data.to_hash 

@execution_id = @report[:load_report_response][:execution_info][:execution_id] 

neuen Kunden erstellen, die den Zugriff hat den Bericht über die laufen Ausführungs-ID:

@newClient = Savon.client(wsdl: "/path/to/report/wsdl", basic_auth: ["user", "pass"], 
:soap_header => {:"tns:TrustedUserHeader" => {"tns:UserName"=> "" , "tns:UserToken" => ""}, :"tns:ExecutionHeader" => {"tns:ExecutionID" => @execution_id}}) 

erstellen Params Hash:

param1 = { :Parameter_value =>{ 
    :"Name" => "nameOfParam", 
    :"Value" => current_user.company_id 
    } 
} 

Anruf setExecutionParameters:

response = @newClient.call(:set_execution_parameters, message: { "Parameters" => param1}) 

Jetzt funktioniert es. Beachten Sie, dass es wichtig ist, wie Sie Namespaces mit Savon angeben. Wenn Sie es nicht richtig machen, wird der Namespace für einige Tags nicht angegeben. wodurch der Soap-Aufruf fehlschlägt.

+0

Ich möchte auch darauf hinweisen, dass die "TrustedUserHeader" und alle Unter-Tags erforderlich waren, um dies zu tun, unabhängig davon, ob sie leer waren oder nicht. – user2967603

0

Sie sollten die SOAP_HEADER Hash verwenden, um Session-ID wie

response = client.call(:set_execution_parameters, :soap_header => { :session_id => sid }) 

Prost

+0

Dies legt nur den soap_header in Locals fest und Savon übergibt globals in client.rd. Ich bekomme immer noch den gleichen Fehler und session_id ist immer noch leer in der soap_header, wenn ich Ihre Lösung versuche. – user2967603

Verwandte Themen