Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.189.22.136] |
|
Сообщ.
#1
,
|
|
|
Есть некий сервис, к которому я подключаюсь, он требует дополнительных заголовков по стандарту OASIS, все в принципе работает.
Код вызова метода выглядит так: private void BtnEmpGetClosureCodes_Click(object sender, EventArgs e) { var empGetClosureCodesDlg = new EmpGetClosureCodesDlg(); empGetClosureCodesDlg.ShowDialog(); if (empGetClosureCodesDlg.DialogResult != DialogResult.OK) { return; } LogToTextBox(">>> EmpGetClosureCodes"); using (var clntWcf = new Service21.EmployerWebServiceV21SoapClient()) using (new OperationContextScope(clntWcf.InnerChannel)) { OperationContext.Current.OutgoingMessageHeaders.Add(CreateSecurityHeader()); try { Service21.EmpClosureCodesResp res = clntWcf.EmpGetClosureCodes(empGetClosureCodesDlg.CaseNumber, empGetClosureCodesDlg.CurrentlyEmployed.ToString()); CheckResponse(res.ReturnStatus, res.ReturnStatusMsg); LogToTextBox("<<< Answer"); LogToTextBox(String.Format("Responce ({0}) {1}", res.ReturnStatus, res.ReturnStatusMsg)); LogToTextBox("<<< Answer data"); foreach (var closureCode in res.ClosureCodeListArray) { LogToTextBox(String.Format("ClosureCode: {0} {1})", closureCode.ClosureCode, closureCode.ClosureCodeDescr)); } } catch (Exception err) { LogToTextBox("<<< Answer"); LogToTextBox(err.Message); } finally { LogToTextBox(""); } } } Для того, что бы добалялвся нужный заголовок добавляется строкой OperationContext.Current.OutgoingMessageHeaders.Add(CreateSecurityHeader()); Где CreateSecurityHeader Функция которая собственно и создает этот заголовок. Все отлично. Но если надо выполнить подряд два метода, то приходится удалять старый заголовок из контекста, и добавлять новый (в этих заголовках меняются данные, по которым сервис определяет атаки (Nonce если кто знает)). Сделал типа такого (Добавил следующий код после вывода ответа от предыдущего запроса): OperationContext.Current.OutgoingMessageHeaders.RemoveAt( OperationContext.Current.OutgoingMessageHeaders.FindHeader( firstSecHeader.Name, firstSecHeader.Namespace ) ); OperationContext.Current.OutgoingMessageHeaders.Add(CreateSecurityHeader()); Service21.EmpClosureCodesResp res2 = clntWcf.EmpGetClosureCodes(empGetClosureCodesDlg.CaseNumber, empGetClosureCodesDlg.CurrentlyEmployed.ToString()); CheckResponse(res2.ReturnStatus, res2.ReturnStatusMsg); Но как-то странно это... Другой варинат, просто на каждый запрос пересоздвать клиента. Хоть сервис и стейтлесс, и все работает даже в этом случае, но как-то это мне кажется не правильным. Как правильно вызывать последовательно методы с разными заголовками не пересоздавая клиента? |