HttpModule расширяет WebDAV - Throwing 500 - PullRequest
0 голосов
/ 09 мая 2019

У меня есть HttpModule со следующим обработчиком событий, установленным на нашем сервере WebDAV. Многие из наших клиентов помещают файлы на наш сервер, используя семантику создания файла, они добавляют имя файла для создания на URL, и файл создается WebDAV на сервере. Стандартный WebDAV. Однако некоторые из наших клиентов не имеют систем, которые могут генерировать динамическое имя файла при каждом вызове. Им нужен более традиционный Webhook для POST (не PUT) статического URL. Этот обработчик событий, который срабатывает после успешной аутентификации, заботится об этом. Этот обработчик событий работает по своему прямому назначению. WebDAV PUTs, DELETEs, PROPFIND все работают. POST обрабатывается этой функцией. файлы загружаются на наш сервер через PUT или POST. Пока все хорошо.

Одна вещь перестала работать, хотя. Я больше не могу открыть файл Excel через диск Windows, который отображается через WebDAV. Я могу копировать файлы в и из, однако, когда я пытаюсь открыть Excel непосредственно из документа сопоставления дисков WebDAV, я получаю сообщение об ошибке. Несмотря на то, что это ограниченный вариант использования, меня больше волнует тот факт, что на сервере что-то не на 100% правильно, и я хотел бы исправить это, если смогу. Журналы и диагностика находятся ниже фрагмента кода.

Пара замечаний по поводу кода.

  1. Он специально ищет глагол POST. Если текущая транзакция не POST, она завершается, ничего не делая. Поэтому я не понимаю, как это может помешать чему-либо, кроме POST.

  2. Вся функция заключена в блок try с пустым обработчиком catch. Я не понимаю, как можно получить ошибку сервера 500 из этой функции.

    private void OnPostAuthenticateRequest(object sender, EventArgs e)
    {
        try
        {
            HttpContext ctx = HttpContext.Current;
    
            if (ctx.Request.RequestType == "POST")
            {
                try
                {
                    string folder = ctx.Request.PhysicalPath;
                    if (folder.EndsWith("\\"))
                    {
                        folder = folder.Substring(0, folder.Length - 1);
                    }
                    string[] subs = folder.Split('\\');
                    string[] logon = ctx.Request.LogonUserIdentity.Name.Split('\\');
    
                    if (logon.Length > 0 && subs.Length > 1 && subs[subs.Length - 2].ToLower() == logon[logon.Length - 1].ToLower())
                    {
                        string body;
                        using (Stream inputStream = ctx.Request.InputStream)
                        {
                            inputStream.Position = 0;
                            using (StreamReader readStream = new StreamReader(inputStream, Encoding.UTF8))
                            {
                                body = readStream.ReadToEnd();
                            }
                        }
    
                        string file = ctx.Request.Params["filename"];
    
                        if (file == null || file.Trim() == "")
                        {
                            file = ctx.Request.Headers["filename"];
                        }
    
                        if (file == null || file.Trim() == "")
                        {
                            file = logon[logon.Length - 1].Replace("_", "") + "_" + subs[subs.Length - 1].ToLower() + "_" + Guid.NewGuid() + ".txt";
                        }
    
                        if (File.Exists(Path.Combine(folder, file)))
                        {
                            ctx.Response.StatusCode = 409;
                        }
                        else
                        {
                            File.WriteAllText(Path.Combine(folder, file), body);
                            ctx.Response.StatusCode = 200;
                        }
                    }
                    else
                    {
                        ctx.Response.StatusCode = 400;
                    }
    
                    ctx.ApplicationInstance.CompleteRequest();
                }
                catch (Exception ex)
                {
                    ctx.Response.StatusCode = 400;
                    ctx.ApplicationInstance.CompleteRequest();
                }
            }
        }
        catch
        {
            // Exit gracefully
        }
    }
    

Три записи журнала для каждой попытки открытия рабочей книги. Первый возвращает 401, а затем вторые два, которые сопровождаются учетными данными, и, таким образом, войдут в мой модуль Webhook, оба потерпят неудачу с 500.

2019-05-09 03:04:25 W3SVC1 myhost 10.0.0.6 HEAD /Admin/workbook.xlsm - 443 - 68.199.109.17 HTTP/1.1 Microsoft+Office+Excel+2014 _ga=GA1.2.904248333.1551983251 - myhost.mydomain.com 401 2 5 293 321 15
2019-05-09 03:04:25 W3SVC1 myhost 10.0.0.6 HEAD /Admin/workbook.xlsm - 443 myaccount 68.199.109.17 HTTP/1.1 Microsoft+Office+Excel+2014 _ga=GA1.2.904248333.1551983251 - myhost.mydomain.com 500 0 0 325 345 62
2019-05-09 03:04:25 W3SVC1 myhost 10.0.0.6 OPTIONS /Admin/workbook.xlsm - 443 myaccount 68.199.109.17 HTTP/1.1 Microsoft+Office/16.0+(Windows+NT+10.0;+Microsoft+Excel+16.0.11601;+Pro) _ga=GA1.2.904248333.1551983251 - myhost.mydomain.com 500 0 0 3733 390 31

Как уже упоминалось выше, я не понимаю, как можно получить 500 из моего обработчика событий из-за закрывающей конструкции try / catch.

У меня включена трассировка невыполненных запросов. Вот только один небольшой реферат из подробного вывода: (Я изменил угловые скобки на квадратные скобки.)

[EventData]
   [Data Name="ContextId"]{80007F2B-0001-F800-B63F-84710C7967BB}[/Data]
   [Data Name="ModuleName"]Webhook[/Data]
   [Data Name="Notification"]2[/Data]
   [Data Name="HttpStatus"]500[/Data]
   [Data Name="HttpReason"]Internal Server Error[/Data]
   [Data Name="HttpSubStatus"]0[/Data]
   [Data Name="ErrorCode"]0[/Data]
   [Data Name="ConfigExceptionInfo"][/Data]
[/EventData]

Итак, это мой модуль - Webhook. Но я понятия не имею, как это может вызвать исключение, которое может стать причиной 500.

Если вы скажете мне, что искать или у вас есть конкретный вопрос, я могу предоставить дополнительную информацию.

Спасибо за любой совет, который вы можете дать!

...