我在我们的WebDAV服务器上安装了带有以下事件处理程序的HttpModule。我们的许多客户使用文件创建语义将文件放置到我们的服务器上,他们在URL上附加要创建的文件名,然后由WebDAV在服务器上创建文件。标准WebDAV。但是,我们的某些客户没有可在每次调用时生成动态文件名的系统。他们希望使用更传统的Webhook将POST(而非PUT)发布到静态URL。此事件处理程序将在成功进行身份验证后触发,以解决此问题。此事件处理程序正在按预期目的工作。 WebDAV PUT,DELETE,PROPFIND都可以使用。 POST由此功能处理。文件通过PUT或POST上传到我们的服务器。到目前为止一切顺利。
但是有件事停止了。我不再能够通过WindowsDA驱动器(通过WebDAV映射)打开Excel文件。我可以在文件之间来回复制,但是当我尝试直接从WebDAV驱动器映射文档中打开Excel时出现错误。尽管这是一个附带的用例,但我更关心以下事实:服务器上的某些内容不是100%正确的,如果可以的话,我希望对此进行更正。日志和诊断信息位于代码段的下方。
关于代码的几点。
它专门查找POST动词。如果当前事务不是POST,它将不执行任何操作而退出。因此,我看不到这会如何影响除POST以外的任何内容。
整个功能都包装在一个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的原因。
如果您告诉我要寻找的内容或有特定问题,我可以提供其他信息。
感谢您提供的任何建议!