Savon 2.11.1 устанавливает заголовок мыла после создания экземпляра клиента Rails + SSRS

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

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) Отсутствует идентификатор сеанса. Для этой операции требуется идентификатор сеанса. ---> Microsoft.ReportingServices.Diagnostics.Utilities.MissingSessionIdException: Отсутствует идентификатор сеанса. Для этой операции требуется идентификатор сеанса.

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


person user2967603    schedule 28.07.2016    source источник


Ответы (2)


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

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

Ваше здоровье

person Abid Iqbal    schedule 29.07.2016
comment
Это только устанавливает soap_header в locals, а Savon передает глобальные значения в client.rd. Я все еще получаю ту же ошибку, и session_id все еще пуст в soap_header, когда я пробую ваше решение. - person user2967603; 03.08.2016

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

Начальный клиент Savon:

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

вызовите load_report, чтобы получить execute_id:

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

Доступ к исполнению_id:

@report = @data.to_hash

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

Создайте новый клиент, у которого есть доступ для запуска отчета через execute_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}}) 

Создайте хэш параметров:

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

Вызов setExecutionParameters:

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

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

person user2967603    schedule 15.08.2016
comment
Я также хочу отметить, что TrustedUserHeader и все вложенные теги необходимы для того, чтобы эта работа работала независимо от того, пусты они или нет. - person user2967603; 15.08.2016