В нашем случае проблема была вызвана вызовом веб-службы с использованием метода запроса OPTIONS (вместо GET или POST).
Мы все еще не знаем, почему проблема внезапно появилась. Веб-служба работала в течение 5 лет отлично по HTTP и HTTPS. Мы единственные, кто потребляет веб-сервис, и он всегда использует POST.
Недавно мы решили сделать сайт, на котором размещен только веб-сервис SSL. Мы добавили правила перезаписи в Web.config, чтобы конвертировать что-либо HTTP в HTTPS, развернуто и сразу же начали получать, помимо обычных запросов GET и POST, запросов OPTIONS. Запросы OPTIONS вызвали ошибку, обсуждаемую на этом посту.
Остальная часть приложения работала отлично. Из-за этой проблемы мы продолжаем получать сотни сообщений об ошибках.
Существует несколько сообщений (например, this ), в которых обсуждается, как обращаться с методом OPTIONS. Мы отправились на обработку запроса OPTIONS непосредственно в Global.asax. Это затруднило проблему.
protected void Application_BeginRequest(object sender, EventArgs e)
{
var req = HttpContext.Current.Request;
var resp = HttpContext.Current.Response;
if (req.HttpMethod == "OPTIONS")
{
//These headers are handling the "pre-flight" OPTIONS call sent by the browser
resp.AddHeader("Access-Control-Allow-Methods", "GET, POST");
resp.AddHeader("Access-Control-Allow-Headers", "Origin, Content-Type, Accept, SOAPAction");
resp.AddHeader("Access-Control-Max-Age", "1728000");
resp.End();
}
}
На Linux можно использовать функцию sysinfo
, который устанавливает значения в следующей структуре:
#include <sys/sysinfo.h>
int sysinfo(struct sysinfo *info);
struct sysinfo {
long uptime; /* Seconds since boot */
unsigned long loads[3]; /* 1, 5, and 15 minute load averages */
unsigned long totalram; /* Total usable main memory size */
unsigned long freeram; /* Available memory size */
unsigned long sharedram; /* Amount of shared memory */
unsigned long bufferram; /* Memory used by buffers */
unsigned long totalswap; /* Total swap space size */
unsigned long freeswap; /* swap space still available */
unsigned short procs; /* Number of current processes */
unsigned long totalhigh; /* Total high memory size */
unsigned long freehigh; /* Available high memory size */
unsigned int mem_unit; /* Memory unit size in bytes */
char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding for libc5 */
};
, Если бы Вы хотите сделать это только использование функций C++ (я придерживался бы sysinfo
), я рекомендую проявить подход C++ с помощью std::ifstream
и std::string
:
unsigned long get_mem_total() {
std::string token;
std::ifstream file("/proc/meminfo");
while(file >> token) {
if(token == "MemTotal:") {
unsigned long mem;
if(file >> mem) {
return mem;
} else {
return 0;
}
}
// ignore rest of the line
file.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}
return 0; // nothing found
}
Помните, что / proc / meminfo - это просто файл. Откройте файл, прочитайте первую строку, закройте файл. Вуаля!
Нет никакой потребности использовать popen()
, можно просто считать файл сами. Кроме того, если там первая строка не будет тем, что Вы ищете, Вы перестанете работать, с тех пор head -n1
только чтения первая строка и затем выходите. Я не уверен, почему Вы смешиваете C и ввод-вывод C++ как этот; это совершенно в порядке, но необходимо, вероятно, решить пойти весь C или весь C++. Я, вероятно, сделал бы это что-то вроде этого:
int GetRamInKB(void)
{
FILE *meminfo = fopen("/proc/meminfo", "r");
if(meminfo == NULL)
... // handle error
char line[256];
while(fgets(line, sizeof(line), meminfo))
{
int ram;
if(sscanf(line, "MemTotal: %d kB", &ram) == 1)
{
fclose(meminfo);
return ram;
}
}
// If we got here, then we couldn't find the proper line in the meminfo file:
// do something appropriate like return an error code, throw an exception, etc.
fclose(meminfo);
return -1;
}
Даже top
(от procps
) синтаксические анализы /proc/meminfo
, см. здесь .