2016-07-28 11 views
1

Я пытаюсь интегрировать приложение rails с Sql Server Reports Services (SSRS) с использованием Savon 2.11.1. Я использую WSDL ReportServicesExecution2005. Проблема заключается в том, что я должен добавить session_id в заголовок мыла после того, как клиент был создан. Это связано с тем, что session_id генерируется SSRS после того, как клиент делает вызов load_report.Savon 2.11.1 set soap header после создания экземпляра клиента Rails + SSRS

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

этот вызов возвращает session_id в ответ:

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

заголовок мыло должно содержать session_id в клиенте, когда этот вызов сделан:

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

попытался это, но это не помогло:

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

я получаю следующее сообщение об ошибке:

(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.

Спасибо за помощь аванса.

ответ

0

Решением, которое я нашел (в то время как неуклюжий) было создание нового клиента с помощью Савона и передать существующие значения клиента плюс новый execute_id/session_Id в конструктор. Это сделал трюк. Пример кода ниже.

Initial Савон Клиент:

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

вызов load_report получить execution_id:

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

Доступ execution_id:

@report = @data.to_hash 

@execution_id = @report[:load_report_response][:execution_info][:execution_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}}) 

Создать Params Hash:

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

Вызов setExecutionParameters:

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

Теперь она работает. Обратите внимание, что это важно, как вы указываете пространства имен с Savon. Если вы не сделаете это правильно, пространство имен не будет указано в некоторых тегах; который вызовет потерю мыла.

+0

Я также хочу отметить, что «TrustedUserHeader» и все суб-теги должны были выполнять эту работу независимо от того, были ли они пустыми или нет. – user2967603

0

Вы должны использовать soap_header хэш передать идентификатор сессии, как

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

Приветствиях

+0

Это устанавливает только soap_header в locals и Savon передает globals в client.rd. Я все еще получаю ту же ошибку, и session_id все еще пуст в soap_header при попытке вашего решения. – user2967603