我們決定只允許帶有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.");
});
我們正在驗證使用JSON模式的任何請求機構及,看到我們絕大多數的終端用戶會更喜歡JSON,我們不會打擾執行同一種驗證XML機構。 我已將 'request.ResponseContentType = MimeTypes.Json;' 添加到我的GlobalRespnoseFilter中。但是,如果我在我的PreRequestfilter中引發HttpError,則GlobalResponseFilter永遠不會被執行。所以我仍然在我的回覆中收到相同的內容長度和內容類型。 如果我在PreRequestFilter中添加「強制」內容類型,我的服務參數的屬性爲空。 – jk1990
我剛剛重讀你的答案,並注意到,你寫了全球**請求**過濾器:) 但添加到我的GlobalRequestFilter而不是GlobalResponseFilter的行後,結果是相同的 – jk1990
編輯:不**完全**相同:具有除/(當然還有application/json)以外的Accept標頭值的任何請求都會以預期的錯誤ResponseStatus進行響應。 但是,我們預計我們的最終用戶將使用Postman來試驗我們的API,並且由於Postman的默認Accept標頭爲/,所以尚未100%解決。 Ps .: = * –
jk1990