powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
16 сообщений из 16, страница 1 из 1
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39624980
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.

ASP.NET Core MVC 2

Проблема: если моё web-приложение работает под управлением IIS, то GET-запрос даёт ошибку InternalServerError. Если же сервер запускать без IIS, напрямую командой dotnet , то всё успешно работает (проверял на Linux Mint 18.3, Windows 10, Windows Server 2012 R2). Ниже показан фрагмент соответствующего кода клиента и код контроллера. В самом низу топика дана ссылка на полный исходный код решения на GitHub.

Вопрос:
В чём может быть причина такого поведения?

POST-запрос работает успешно в обоих случаях.

Кратко о задаче, решаемой сервером:

Клиент отправляет на сервер большой файл (некие исходные данные). В ответ сервер возвращает GUID, на основе которого клиент в дальнейшем сможет получить обратно результат обработки этих данных. Через некоторое время клиент по этому GUID запрашивает результат обработки данных: если данные к этому моменту ещё не были полностью обработаны, то возвращается FileNotFound, а если результат обработки уже готов, то сервер эти данные отправляет клиенту (так же достаточно большой файл). И те и другие файлы могут иметь размеры до 1.5 Гб.

Код клиента, формирующий GET-запрос:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
// get the result of data handling from server
case "get":
{
    Guid guid = Guid.Empty;

    if (!Guid.TryParse(args[1], out guid))
    {
        Console.WriteLine("Invalid identifier (GUID): '{0}'", args[1]);
        return;
    }
    
    var client = new HttpClient();
    client.Timeout = TimeSpan.FromMinutes(timeSpanFromMinutes);
    
        try
        {
            var response = await client.GetAsync(url + "/Home/Download/" + args[1], 
                HttpCompletionOption.ResponseContentRead);
                
            Console.WriteLine("Response status code: {0}", response.StatusCode);
            if (response.StatusCode == HttpStatusCode.OK)
            {
                using (MemoryStream ms = new MemoryStream())
                {
                    await response.Content.CopyToAsync(ms);
                    Console.WriteLine("Data successfully recieved from server. Data length: {0}",
                        ms.Length);

                    string resultFileName = Path.Combine(resultFolder, args[1] 
                                                             + resultFileExtension);
                    using (FileStream fs = new FileStream(resultFileName, FileMode.Create))
                    {
                        await fs.WriteAsync(ms.GetBuffer(), 0, (int) ms.Length);
                    }

                    Console.WriteLine("The result was saved in the '{0}' file.", resultFileName);
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Exception: {0}", ex.Message);
        }
    
    break;
}



Код контроллера, обрабатывающий GET-запрос:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
[HttpGet]
public async Task<IActionResult> Download(Guid id)
{
    try{
            string path = Configuration["ResultFilesLocation"];
            string fileExtension = Configuration["ResultFileExtension"];
            string fileName = id.ToString();
            
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
            
            string fileFullName = Path.Combine(path, fileName + fileExtension);

        if (System.IO.File.Exists(fileFullName))
        {
            FileStream fs = new FileStream(fileFullName, FileMode.Open);
            fs.Position = 0;
            return this.File(fs, "application/octet-stream");
        }
        else
        {
            return StatusCode((int) HttpStatusCode.NotFound);
        }
    }
    catch (Exception ex)
    {
        return StatusCode((int) HttpStatusCode.InternalServerError);
    }
}



Примеры вызова клиента

Код: powershell
1.
2.
dotnet Client.dll "post" "/home/andrey/tmp/dotnet-sdk-2.1.101-linux-x64.tar.gz"
dotnet Client.dll "get" "19760e99-bb70-4f0b-9b84-1c39666b2283"



Полный исходный код проекта на GitHub находится здесь .

С уважением, Андрей
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625009
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,
От чего ещё зависит ошибка?
От того что сервер занят?
От размера файла?
От твоего куска кода?
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625021
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ошибку то хоть дайте посмотреть. что там у вас в логах IIS, что в логах вашего сервиса?
вангую, что параметры размеров отправки в web.config надо поправить для stream binding
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625033
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneошибку то хоть дайте посмотреть. что там у вас в логах IIS, что в логах вашего сервиса?
вангую, что параметры размеров отправки в web.config надо поправить для stream binding
Сейчас поищу, как посмотреть лог IIS и выложу его. Мой web.config:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.webServer>

    <handlers>
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\Server.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <security>
        <requestFiltering>
            <!-- 1.5 GB -->
            <requestLimits maxAllowedContentLength="1717986918" />
        </requestFiltering>

    </security>
</system.webServer>
</configuration>



Мой middleware:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
public class BodyMaxSizeMiddleware
    {
        private RequestDelegate nextDelegate;
        private long? size = null;
        public BodyMaxSizeMiddleware(RequestDelegate next, IConfiguration config)
        {
            nextDelegate = next;
            size = long.Parse(config["MaxRequestBodySize"]);
        }

        public async Task Invoke(HttpContext context)
        {
            context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = size;
            await nextDelegate(context);
        }
    }



Мой appsettings.json:

Код: json
1.
2.
3.
4.
5.
6.
7.
8.
9.
{
  "Protocol" :"HTTP",
  "UseIISIntegration" : false,
  "MaxRequestBodySize" : 1717986918,
  "SourceFileExtension" : ".src",
  "ResultFileExtension" : ".res",
  "SourceFilesLocation" : "sources",
  "ResultFilesLocation" : "results",
  "IsDevelopment" : true
}
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625042
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Gb limit (для вашего конфига):

Код: xml
1.
2.
3.
4.
<system.web>
  <compilation debug="true" targetFramework="4.5" />
  <httpRuntime targetFramework="4.5" maxRequestLength="2147483647" executionTimeout="1600" requestLengthDiskThreshold="2147483647" />
</system.web>
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625045
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лог IIS:

IIS log#Software: Microsoft Internet Information Services 8.5
#Version: 1.0
#Date: 2018-04-03 11:14:20
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2018-04-03 11:14:20 192.168.100.148 GET / - 5001 - 192.168.100.148 Mozilla/5.0+(Windows+NT+6.3;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/65.0.3325.181+Safari/537.36 - 200 0 0 758
2018-04-03 11:14:20 192.168.100.148 GET /favicon.ico - 5001 - 192.168.100.148 Mozilla/5.0+(Windows+NT+6.3;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/65.0.3325.181+Safari/537.36 http://srv14.spb.gpsm.ru:5001/ 404 0 0 3
2018-04-03 11:15:01 192.168.100.148 GET / - 5001 - 192.168.100.148 Mozilla/5.0+(Windows+NT+6.3;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/65.0.3325.181+Safari/537.36 - 200 0 0 13
2018-04-03 11:15:01 192.168.100.148 GET /favicon.ico - 5001 - 192.168.100.148 Mozilla/5.0+(Windows+NT+6.3;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/65.0.3325.181+Safari/537.36 http://srv14.spb.gpsm.ru:5001/ 404 0 0 1
2018-04-03 11:15:42 fe80::704e:35e1:18f0:87b5%12 POST /Home/Upload - 5001 - fe80::704e:35e1:18f0:87b5%12 - - 200 0 0 3313
2018-04-03 11:16:48 fe80::704e:35e1:18f0:87b5%12 GET /Home/Download/9ed50572-67dd-45c9-94b2-6747f911a9a6 - 5001 - fe80::704e:35e1:18f0:87b5%12 - - 500 0 0 46
2018-04-03 11:18:36 fe80::704e:35e1:18f0:87b5%12 GET /Home/Download/9ed50572-67dd-45c9-94b2-6747f911a9a6 - 5001 - fe80::704e:35e1:18f0:87b5%12 - - 500 0 0 15
2018-04-03 11:21:10 fe80::704e:35e1:18f0:87b5%12 GET /Home/Download/9ed50572-67dd-45c9-94b2-6747f911a9a6 - 5001 - fe80::704e:35e1:18f0:87b5%12 - - 500 0 0 0
#Software: Microsoft Internet Information Services 8.5
#Version: 1.0
#Date: 2018-04-03 11:23:01
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2018-04-03 11:23:01 fe80::704e:35e1:18f0:87b5%12 GET /Home/Download/9ed50572-67dd-45c9-94b2-6747f911a9a6 - 5001 - fe80::704e:35e1:18f0:87b5%12 - - 500 19 13 46
2018-04-03 11:27:58 fe80::704e:35e1:18f0:87b5%12 GET /Home/Download/9ed50572-67dd-45c9-94b2-6747f911a9a6 - 5001 - fe80::704e:35e1:18f0:87b5%12 - - 500 0 0 656
#Software: Microsoft Internet Information Services 8.5
#Version: 1.0
#Date: 2018-04-03 11:37:35
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2018-04-03 11:37:35 fe80::704e:35e1:18f0:87b5%12 GET /Home/Download/9ed50572-67dd-45c9-94b2-6747f911a9a6 - 5001 - fe80::704e:35e1:18f0:87b5%12 - - 500 0 0 671
#Software: Microsoft Internet Information Services 8.5
#Version: 1.0
#Date: 2018-04-03 11:38:22
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2018-04-03 11:38:22 fe80::704e:35e1:18f0:87b5%12 GET /Home/Download/9ed50572-67dd-45c9-94b2-6747f911a9a6 - 5001 - fe80::704e:35e1:18f0:87b5%12 - - 500 0 0 15
#Software: Microsoft Internet Information Services 8.5
#Version: 1.0
#Date: 2018-04-03 11:44:24
#Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs(User-Agent) cs(Referer) sc-status sc-substatus sc-win32-status time-taken
2018-04-03 11:44:24 192.168.100.148 GET / - 80 - 192.168.100.148 Mozilla/5.0+(Windows+NT+6.3;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/65.0.3325.181+Safari/537.36 - 200 0 0 734
2018-04-03 11:44:24 192.168.100.148 GET /favicon.ico - 80 - 192.168.100.148 Mozilla/5.0+(Windows+NT+6.3;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/65.0.3325.181+Safari/537.36 http://srv14.spb.gpsm.ru/ 404 0 0 3
2018-04-03 11:45:00 fe80::704e:35e1:18f0:87b5%12 POST /Home/Upload - 80 - fe80::704e:35e1:18f0:87b5%12 - - 200 0 0 3083
2018-04-03 11:45:17 fe80::704e:35e1:18f0:87b5%12 GET /Home/Download/9ed50572-67dd-45c9-94b2-6747f911a9a6 - 80 - fe80::704e:35e1:18f0:87b5%12 - - 500 0 0 31
2018-04-03 11:53:34 192.168.100.148 GET / - 80 - 192.168.100.148 Mozilla/5.0+(Windows+NT+6.3;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/65.0.3325.181+Safari/537.36 - 200 0 0 148
2018-04-03 11:54:18 192.168.100.148 GET / - 80 - 192.168.100.11 Mozilla/5.0+(Windows+NT+6.3;+WOW64;+rv:45.0)+Gecko/20100101+Firefox/45.0 - 200 0 0 0
2018-04-03 11:54:18 192.168.100.148 GET /favicon.ico - 80 - 192.168.100.11 Mozilla/5.0+(Windows+NT+6.3;+WOW64;+rv:45.0)+Gecko/20100101+Firefox/45.0 - 404 0 0 46
2018-04-03 11:54:18 192.168.100.148 GET /favicon.ico - 80 - 192.168.100.11 Mozilla/5.0+(Windows+NT+6.3;+WOW64;+rv:45.0)+Gecko/20100101+Firefox/45.0 - 404 0 0 46
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625048
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One2Gb limit (для вашего конфига):
Я не понял этой фразы.
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625050
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему лог своего сервиса не смотришь, там наверняка что-то такое:

HttpClient Error "An internal response size limit was exceeded"
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625053
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CompositumKonst_One2Gb limit (для вашего конфига):
Я не понял этой фразы.

в свой web.config секцию добавь (версию FW поправь , если надо)
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625065
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote Konst_One]Compositumпропущено...
в свой web.config секцию добавь (версию FW поправь , если надо)
У меня .NET Core 2, а не .NET Framework.
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625069
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а сами отредактировать никак?
Код: xml
1.
2.
3.
<system.web>
  <httpRuntime maxRequestLength="2147483647" executionTimeout="1600" requestLengthDiskThreshold="2147483647" />
</system.web>
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625084
Фотография Compositum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneа сами отредактировать никак?
Код: xml
1.
2.
3.
<system.web>
  <httpRuntime maxRequestLength="2147483647" executionTimeout="1600" requestLengthDiskThreshold="2147483647" />
</system.web>



Подправил:

Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\Server.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
    <security>
      <!--<requestFiltering>        
        <requestLimits maxAllowedContentLength="1717986918" />
      </requestFiltering>-->
    </security>
  </system.webServer>
	<system.web>
		<httpRuntime maxRequestLength="2147483647" executionTimeout="1600" requestLengthDiskThreshold="2147483647" />
	</system.web>
</configuration>



Перезапустил. Ошибка та же, но дополнительно теперь перестал корректно работать и POST-запрос: возвращает NotFound.
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625086
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Compositum,
Зачем вы открываете файл при случае отсутствии папки для него?
Большой файл пишется медленно. Т.е. имя его на диске будет, а сам он еще не дописался.
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625088
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем это то закоментировали?

Код: xml
1.
2.
3.
      <!--<requestFiltering>        
        <requestLimits maxAllowedContentLength="1717986918" />
      </requestFiltering>-->



вы логи своего сервиса принципиально не хотите посмотреть?
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625089
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убирайте await, добавляйте базу со списком файлов и галкой что файл записан и готов для Get.
...
Рейтинг: 0 / 0
GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
    #39625092
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
    catch (Exception ex)
    {
//тут запишите эксепшен в лог и посмотрите , что там у вас случилось!
        return StatusCode((int) HttpStatusCode.InternalServerError);
    }
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / GET-запрос выдаёт ошибку, если web-приложение работает под управлением IIS
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]