2016-04-14 95 views
2

我們決定只允許帶有Content-Type頭「application/json」的請求。 因此,無論何時我們收到帶有替代或缺失的Content-Type標頭的請求,我們都會拋出一個HttpError。這應該返回一個包含JSON ResponseStatus正文與相關信息的400響應。然而,如果發送Content-Type text/plain,我們會拋出一個HttpError,但是響應的Content-Type是text/plain和content-length:0.我期望ServiceStack的ResponseStatus被返回。如果將Accept應用程序/ json頭添加到請求,ResponseStatus會返回正常。 我用郵差執行了請求。 Fiddler4截屏: 如何確保ServiceStack始終返回JSON?

我知道郵差添加接受/頭。所以我的問題是:我怎樣才能確保拋出的HttpError總是以JSON的形式返回ResponseStatus,無論請求的Accept頭是什麼?

的調用setConfig:

SetConfig(new HostConfig 
     { 
      EnableFeatures = Feature.All.Remove(Feature.Html | Feature.Csv | Feature.Jsv | Feature.Xml | Feature.Markdown | Feature.Razor | Feature.Soap | Feature.Soap11 | Feature.Soap12 | Feature.PredefinedRoutes), 
      DebugMode = false, 
      DefaultContentType = MimeTypes.Json 
     }); 

據我所知,每當有沒有在請求的Accept報頭的DefaultContentType時才使用。

的PreRequestFilter:

PreRequestFilters.Add((request, response) => 
     { 
      if (request.Verb.Equals("OPTIONS")) 
       response.EndRequest(); 
      if (request.GetHeader("Content-Type") == null || !request.GetHeader("Content-Type").Equals(MimeTypes.Json)) 
       throw new HttpError((int)HttpStatusCode.BadRequest, "Bad request", "Expected a Content-Type header with an application/json value but found none. See http://docsdomain.com/ for any required headers."); 
     }); 

回答

2

的HTTP Accept頭是客戶端使用什麼顯示什麼反應類型,應返回,但您可以覆蓋這總是加全局請求篩選並明確設置返回JSON ResponseContentType,如:

GlobalRequestFilters.Add((req,res,dto) => 
    req.ResponseContentType = MimeTypes.Json); 

如果Accept頭沒有指定具體的響應方式,則默認爲使用PreferredContentTypes您ç一個變化是:

SetConfig(new HostConfig { 
    PreferredContentTypes = new []{ MimeTypes.Json }.ToList(), 
}); 
+0

我們正在驗證使用JSON模式的任何請求機構及,看到我們絕大多數的終端用戶會更喜歡JSON,我們不會打擾執行同一種驗證XML機構。 我已將 'request.ResponseContentType = MimeTypes.Json;' 添加到我的GlobalRespnoseFilter中。但是,如果我在我的PreRequestfilter中引發HttpError,則GlobalResponseFilter永遠不會被執行。所以我仍然在我的回覆中收到相同的內容長度和內容類型。 如果我在PreRequestFilter中添加「強制」內容類型,我的服務參數的屬性爲空。 – jk1990

+0

我剛剛重讀你的答案,並注意到,你寫了全球**請求**過濾器:) 但添加到我的GlobalRequestFilter而不是GlobalResponseFilter的行後,結果是相同的 – jk1990

+0

編輯:不**完全**相同:具有除/(當然還有application/json)以外的Accept標頭值的任何請求都會以預期的錯誤ResponseStatus進行響應。 但是,我們預計我們的最終用戶將使用Postman來試驗我們的API,並且由於Postman的默認Accept標頭爲/,所以尚未100%解決。 Ps .: = * – jk1990