HttpModule扩展WebDAV-投掷500

时间:2019-05-09 04:03:28

标签: c# iis webdav httpmodule

我在我们的WebDAV服务器上安装了带有以下事件处理程序的HttpModule。我们的许多客户使用文件创建语义将文件放置到我们的服务器上,他们在URL上附加要创建的文件名,然后由WebDAV在服务器上创建文件。标准WebDAV。但是,我们的某些客户没有可在每次调用时生成动态文件名的系统。他们希望使用更传统的Webhook将POST(而非PUT)发布到静态URL。此事件处理程序将在成功进行身份验证后触发,以解决此问题。此事件处理程序正在按预期目的工作。 WebDAV PUT,DELETE,PROPFIND都可以使用。 POST由此功能处理。文件通过PUT或POST上传到我们的服务器。到目前为止一切顺利。

但是有件事停止了。我不再能够通过WindowsDA驱动器(通过WebDAV映射)打开Excel文件。我可以在文件之间来回复制,但是当我尝试直接从WebDAV驱动器映射文档中打开Excel时出现错误。尽管这是一个附带的用例,但我更关心以下事实:服务器上的某些内容不是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,然后第二个返回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

如上所述,由于涵盖了try / catch构造,因此我看不到如何从事件处理程序中获得500。

我已启用失败请求跟踪。这只是详细输出中的一个小摘要:(我将尖括号更改为方括号。)

[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的原因。

如果您告诉我要寻找的内容或有特定问题,我可以提供其他信息。

感谢您提供的任何建议!

0 个答案:

没有答案