IIS的“Web园”机制造成,误以为lock锁失效

本文解决了一个在IIS应用程序池中遇到的问题,即在处理工资条生成和发送时,由于多进程并发操作同一文件导致的死锁现象。通过调整IIS应用程序池的最大工作进程数为1,避免了多进程竞争同一资源的问题。

出错情况

            最近在做一个单独线程处理工资条的生成和发送时,出现了一个“另一个进程正在使用此文件,因此该进程无法访问此文件。”的程序错误,造成IIS应用程序池总是死掉。

原因分析

           刚开始通过日志分析,发现是子线程多次启动,造成了资源的竞争使用。通过分析代码:

          

         错误的以为是locker锁失效或静态变量掉值,但是通过进一步的日志分析,发现启动子线程的不是同一个进程Id。

 

解决方案

       打开IIS的应用程序池>高级设置

      

    当最大工作进程数>1时,IIS会以“web园”的方式进行工作。因为"web园"会以进程的方式进行请求的处理,多个进程同时处理,所以会导致看到线程多次启动的假象。所以解决方案是将最大工作进程数设置为1,或更改程序进行分配式的方式处理数据。

<think>我们正在讨论Office Online Server (OOS)如何返回自定义错误弹窗。这通常涉及到在OOS与客户端(如浏览器)之间传递错误信息时,自定义用户看到的错误消息。 由于OOS是一个服务器产品,其错误处理机制主要通过WOPI协议与客户端交互。默认情况下,错误消息是OOS预定义的,但我们可以通过一些配置和开发手段自定义部分错误提示。 方法: 1. **自定义HTTP错误页面**:OOS作为IIS应用程序运行,可以在IIS中配置自定义错误页面(针对特定HTTP状态码)。但注意,这会影响整个OOS应用,且只能自定义静态页面,无法动态传递错误详情。 2. **利用WOPI协议扩展**:在实现WOPI主机(如SharePoint)时,可以通过WOPI客户端(浏览器)传递自定义错误信息。这需要修改WOPI主机(例如SharePoint的自定义开发)来提供自定义错误信息,然后由Office Online客户端显示。 3. **客户端脚本拦截**:在浏览器端,可以通过JavaScript监听Office Online发出的错误事件,然后覆盖默认弹窗,显示自定义内容。但这种方法依赖于客户端环境,且可能因OOS更新而失效。 具体步骤示例(方法2): - 在WOPI主机(如SharePoint)中,当检测到OOS返回错误时,捕获错误代码,然后根据业务逻辑返回自定义错误消息。 - 在WOPI操作的响应中,可以包含自定义的错误信息,但需要客户端(浏览器中的Office Online)支持。实际上,Office Online客户端会显示来自WOPI主机的错误消息。 然而,需要注意的是,Office Online Server本身并不直接提供配置自定义错误弹窗的选项,自定义工作主要在WOPI主机(如SharePoint)上完成。 示例代码(WOPI主机端处理): 假设在WOPI主机的CheckFileInfo操作中,如果发现文件不可访问,可以返回一个错误,然后在浏览器端由Office Online显示该错误。 但实际错误处理通常是在WOPI的各个操作(如GetFile, Lock等)中返回非200的HTTP状态码和自定义错误信息。 关键点:OOS遵循WOPI协议,错误信息会通过WOPI操作响应中的头或体传递,但具体如何显示由Office Online客户端决定。因此,自定义错误弹窗的灵活性有限。 注意事项: - 避免暴露敏感信息:自定义错误信息不应包含服务器内部细节。 - 兼容性:不同Office客户端(浏览器、桌面App)处理错误的方式可能不同。 因此,最可行的方案是在WOPI主机端(如SharePoint)进行自定义错误处理,并确保其符合WOPI协议,以便Office Online客户端能够正确显示。 下面我们提供一种在IIS中配置自定义错误页面的方法(方法1)作为补充: 步骤: 1. 在OOS服务器上打开IIS管理器。 2. 找到Office Web Apps站点(通常名为“Office Web Apps”)。 3. 在“错误页面”功能中,编辑特定状态码(如500)的错误页,指向一个自定义HTML文件。 但是,这种方法只能自定义静态内容,且无法针对不同的错误原因动态显示。 结论:主要自定义途径在WOPI主机,而非OOS本身。 现在,根据要求,在回答后提出3-5个相关问题。</think>### Office Online Server 自定义错误弹窗配置方法 在 Office Online Server (OOS) 中实现自定义错误弹窗需要通过 **WOPI 协议处理**和 **IIS 配置**结合实现,以下是具体步骤: #### 核心配置流程 1. **创建自定义错误页面** ```html <!-- 保存为 /owa/error/custom_error.html --> <!DOCTYPE html> <html> <head><title>自定义错误</title></head> <body> <h1>操作受阻</h1> <p>错误代码: <span id="errorCode"></span></p> <script> // 从URL参数获取错误代码 const params = new URLSearchParams(window.location.search); document.getElementById('errorCode').textContent = params.get('code') || '未知错误'; </script> </body> </html> ``` 2. **修改 IIS 错误映射** ```powershell # 在OOS服务器执行 Import-Module WebAdministration Set-WebConfigurationProperty ` -PSPath "IIS:\Sites\Office Web Apps" ` -Filter "system.webServer/httpErrors" ` -Name errorMode -Value "Custom" Add-WebConfigurationProperty ` -PSPath "IIS:\Sites\Office Web Apps" ` -Filter "system.webServer/httpErrors/error" ` -Name "." -Value @{ statusCode='500' path='/owa/error/custom_error.html' responseMode='ExecuteURL' } ``` 3. **WOPI 处理器自定义** ```csharp // 在WOPI主机应用(如SharePoint)中添加错误处理 public class CustomWopiHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { try { // 正常WOPI处理逻辑 } catch (Exception ex) { context.Response.Redirect( $"/owa/error/custom_error.html?code=WOPI_{ex.GetType().Name}" ); } } } ``` #### 关键注意事项 1. **错误类型覆盖范围** - HTTP 500 错误:文档访问故障 - HTTP 404 错误:文件不存在 - WOPI_E_DISABLED:许可证失效错误 2. **部署限制** - 需在**所有** OOS 服务器节点部署相同错误页面 - 更新后必须重启 IIS:`iisreset /noforce` - 自定义页面大小需 < 256KB 3. **调试建议** - 检查事件日志:`Get-WinEvent -LogName "Office Web Apps"` - 启用跟踪日志:`Set-OfficeWebAppsFarm -LogLocation "C:\logs\" -LogVerbose`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值