Member 12793392 Ответов: 2

Какой подход лучше всего подходит для обработки нескольких веб-запросов с помощью C#?


Я создал веб-службу (WCF) с помощью C#.
В котором пользователь указывает входные параметры в URL-адресе, что входные параметры сохраняются в файле (temp. inc) и переопределяются в соответствии с новыми запросами. затем вывод XML генерируется в соответствии с заданными входными данными. Но когда несколько запросов пытаются получить доступ к веб-службе одновременно, то возникают конфликты, и только первый запрос получает вывод XML, а остальные все получают ошибку.
Существует ли какой-либо способ обработки нескольких запросов, чтобы только один запрос мог получить доступ к веб-службе одновременно, а остальные запросы будут ждать, пока не будут выполнены первые запросы.

Я хотел знать, как лучше всего сделать это с помощью C#.

Что я уже пробовал:

Я попробовал сделать это с помощью многопоточности, но из-за недостаточных знаний на C# я еще не получил никакого решения той же проблемы.

ZurdoDev

Вы должны отправить вывод xml обратно в качестве ответа на запрос, а не помещать его в файл.

Member 12793392

@RyanDev: Нет, я не могу этого сделать, потому что в моем веб-сервисе 2 временных файла 1. temp.inc и 2. tempdata.xml. Я генерирую XML-файл данных модуля Doors, и этот файл генерируется в соответствии с заданным входом в URL. Входные параметры хранятся в файле temp. inc, а затем tempdata.xml файл переопределяется и отображается в браузере.

Проблемы возникают, когда несколько пользователей пытаются получить доступ к веб-службе одновременно, а затем файл temp.inc конфликтует и получает ошибку.

Richard Deeming

Измените свой код таким образом, чтобы вы передавали параметры непосредственно методу, который генерирует данные, и метод возвращал данные напрямую, а не полагался на временные файлы.

Итак, вместо:

void GenerateData()
{
    YourSettingsClass theSettings = ReadSomeSettingsFromAFile("temp.inc");
    YourDataClass theData = GenerateTheData(theSettings);
    SaveTheDataToAFile(theData, "tempdata.xml");
}

ты бы так и сделал:
YourDataClass GenerateData(YourSettingsClass theSettings)
{
    YourDataClass theData = GenerateTheData(theSettings);
    return theData;
}

Вы не только избежите проблемы, с которой столкнулись, но и значительно повысите производительность своего кода.

F-ES Sitecore

Решение состоит не в том, чтобы дросселировать WCF, чтобы запросы обрабатывались по одному, а в том, чтобы не использовать один и тот же временный файл для всех запросов. См. Решение 1 для возможного обходного пути, но это тот путь, который вы хотите использовать.

2 Ответов

Рейтинг:
1

#realJSOP

Измените метод веб-службы, чтобы он принимал GUID в качестве параметра, и генерируйте новый guid на клиенте для каждого запроса. Затем используйте GUID как часть имени файла при сохранении xml-данных.

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

РЕДАКТИРОВАТЬ ================

Если это возможно, то, вероятно, было бы лучше поместить результат в базу данных вместе с GUID, чтобы он мог быть получен клиентом через 2-й метод веб-службы. Таким образом, у вас не было бы разногласий между файлами и трудностей с именованием.


Member 12793392

Спасибо вам за ваше решение. Я постараюсь это осуществить.

#realJSOP

Однако то, что предложил Ряндев, - самый правильный подход. Вы должны вернуть результат клиенту для обработки. Это сразу же решило бы проблему.

Member 12793392

На самом деле я не могу использовать какую-либо внешнюю базу данных, поэтому невозможно поместить результаты в базу данных. Вместо того, чтобы использовать базу данных, я постараюсь реализовать подходы, предложенные @RyanDev и @Ричард считая.

Рейтинг:
1

Keviniano Gayo

Вы можете использовать ключевое слово lock и использовать частную статическую объектную переменную, а затем внутри оператора lock вы можете обрабатывать свои файлы.
заявление о блокировке[^]