2016-07-06 19 views
1

我正在開發一個ASP.Net核心1.0(發行版)API項目。
我寫了一個自定義的異常過濾器來記錄並向調用者返回一個標準錯誤。在IIS-Express下一切都按預期運行。我得到了500個響應代碼和自定義json對象。當我部署到完整的IIS服務器時,我沒有得到任何迴應。錯誤被記錄下來,但響應永遠不會發送回客戶端。這對我來說是個謎。編寫自定義500響應正文與IIS Express一起使用,但在IIS上失敗ASP.Net核心1.0

這裏是異常過濾器:

public async Task OnExceptionAsync(ExceptionContext context) 
{ 
    Exception ex = context.Exception; 
    string message = string.Empty; 
    int incidentId = 0; 

     string parameters = string.Empty; 
     if (ex is NotifyingException) 
     { 
      parameters = Newtonsoft.Json.JsonConvert.SerializeObject(((NotifyingException)ex).NotificationData); 
     } 
     incidentId = await Logger.LogIncidentAsync(context.HttpContext.Request.Path, ex, parameters); 
     message = string.Format(ValidationResources.OperationFailed, incidentId); 

    string msg = Newtonsoft.Json.JsonConvert.SerializeObject(new { message = message, incidentId = incidentId }); 
    byte[] bytes = Encoding.UTF8.GetBytes(msg); 

    context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; 
    await context.HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length); 
} 

在startup.cs,我加入這樣的過濾器(IncidentExceptionFilter):

services.AddMvc(config => 
    { 
     var policy = new AuthorizationPolicyBuilder().RequireAuthenticatedUser().Build(); 
     config.Filters.Add(new AuthorizeFilter(policy)); 
     config.Filters.Add(new ClaimsAuthorizationFilter()); 
     config.Filters.Add(new CorsAuthorizationFilterFactory("AllowAll")); 
     config.Filters.Add(typeof(IncidentExceptionFilter)); 
    } 
    ); 

我有一個簡單的測試頁面,只是拋出一個例外來測試。 這就是我在IIS上運行時使用郵差: enter image description here

完美。正是我期望的。儘管在完整的IIS下,郵差說:「計數沒有得到任何迴應」。 API的其餘部分工作正常,並且日誌被寫入,所以它進入過濾器,只是沒有什麼東西出來......

+1

奇怪。順便說一句,你可以在你的異常過濾器中做到這一點,並避免明確寫入。嘗試一下,看看它是否修復了IIS中的問題 var result = new JsonResult(new {message = message,incidentId = incidentId}); result.StatusCode = 500; context.Result = result; –

+0

這確實解決了問題!謝謝!神祕仍然存在,但問題已解決。 – Elton

+0

您可以嘗試一件事......在我建議的更改之前,您是否可以嘗試明確設置Content-Length屬性並查看是否修復了IIS –

回答

1

正如Kiran在上面提到的,我沒有設置內容長度。這解決了這個問題。現在,這兩種解決方案在IIS上正常工作:

string msg = Newtonsoft.Json.JsonConvert.SerializeObject(new { message = message, incidentId = incidentId }); 
byte[] bytes = Encoding.UTF8.GetBytes(msg); 

context.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError; 
context.HttpContext.Request.ContentLength = bytes.Length; 
await context.HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length); 

OR

var result = new JsonResult(new { message = message, incidentId = incidentId }); 
result.StatusCode = StatusCodes.Status500InternalServerError; 
context.Result = result; 

哪個是乾淨多了!

相關問題