На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> WCF Сервис, как правильно отправлять подряд идущие запросы?
    Есть некий сервис, к которому я подключаюсь, он требует дополнительных заголовков по стандарту OASIS, все в принципе работает.
    Код вызова метода выглядит так:

    ExpandedWrap disabled
              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("");
                      }
                  }
              }


    Для того, что бы добалялвся нужный заголовок добавляется строкой
    ExpandedWrap disabled
      OperationContext.Current.OutgoingMessageHeaders.Add(CreateSecurityHeader());


    Где CreateSecurityHeader Функция которая собственно и создает этот заголовок.
    Все отлично.
    Но если надо выполнить подряд два метода, то приходится удалять старый заголовок из контекста, и добавлять новый (в этих заголовках меняются данные, по которым сервис определяет атаки (Nonce если кто знает)).
    Сделал типа такого (Добавил следующий код после вывода ответа от предыдущего запроса):

    ExpandedWrap disabled
                          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);


    Но как-то странно это... Другой варинат, просто на каждый запрос пересоздвать клиента. Хоть сервис и стейтлесс, и все работает даже в этом случае, но как-то это мне кажется не правильным.

    Как правильно вызывать последовательно методы с разными заголовками не пересоздавая клиента?
    Сообщение отредактировано: Felan -
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0163 ]   [ 16 queries used ]   [ Generated: 3.05.24, 02:58 GMT ]