Как сохранить сеансы при обращении к веб-службе ASP.Net из Soap-клиента - PullRequest
3 голосов
/ 14 сентября 2010

Вот как настроена моя система:

  • Веб-сервис, использующий веб-сервис ASP.Net
  • Веб-сервис имеет веб-метод с EnableSession = true
  • Клиент, который ссылается на веб-службу с помощью «Ссылок на службу» (примечание: не «Веб-ссылки»)
  • В app.config клиента есть allowCookies = true

На стороне клиента у меня есть следующий код для загрузки файла в службу

bool res = service.InitiateUpload();
if (res) {
    do {
        read = stream.Read(buffer, 0, BLOCK_SIZE);
        if (read == BLOCK_SIZE)
            res = res && service.AppendUpload(buffer);
        else if (read > 0)
            // other call to AppendUpload, after buffer manipulation

На стороне сервера у меня есть код, который проверяет, совпадает ли идентификатор сеанса из вызова InitiateUpload сAppendUpload.

[WebMethod(EnableSession=true)]
public bool InitiateUpload() {
  lock (theLock) {
    if (IsImportGoingOn)
      return false;

    theImportDataState = new ImportDataState(Session.SessionID);
  }
  return true;
}

[WebMethod(EnableSession=true)]
public bool AppendUpload(byte[] data) {
  lock (theLock) {
    if (!IsImportGoingOn)
      return false;

    if (theImportDataState.session != Session.SessionID)
      return false;

    theImportDataState.buffer.AddRange(data);
    return true;
  }
}

Вызов AppendUpload возвращает значение false из-за несовпадения идентификаторов сеанса.Это почему?Насколько я вижу, у меня есть правильные атрибуты для веб-метода, клиент имеет правильную конфигурацию, и используется тот же экземпляр прокси.Я что-то упустил?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2010

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

Возможно, лучшим способом было бы для службы передать идентификатор транзакцииклиент может использовать для ссылки на загрузку в будущем.В долгосрочной перспективе это будет чище и, вероятно, будет меньше работы, чем заставить клиента работать с файлами cookie и, следовательно, сессиями.

0 голосов
/ 03 октября 2018

Вы должны использовать CookieContainer, чтобы сохранить сеанс.

частный System.Net.CookieContainer CK = новый System.Net.CookieContainer ();

Тогда просто используйте это как CookieContainer вашего сервисного объекта.

...