2016-04-14 45 views
2

Yalnızca Content-Type üstbilgisi "application/json" ile isteklere izin vermeye karar verdik. Yani, bir seçenek veya eksik Content-Type üstbilgisi ile bir istek aldığımızda, bir HttpError atarız. Bu ,, ilgili bilgiler içeren bir JSON ResponseStatus gövdesi içeren 400 yanıt döndürmelidir. Ancak, bir Content-Type metin/düz gönderilirse, bir HttpError atar, ancak yanıtlayanın Content-Type metin/düz ve içerik-uzunluktur: 0. ServiceStack'ın ResponseStatus'unun döndürülmesini bekledim. İstekte bir Accept uygulaması/json başlığı eklediğimde ResponseStatus düzgün şekilde iade edilir. İsteği Postman kullanarak gerçekleştirdim. Fiddler4 ekran görüntüsü: ServiceStack'ın her zaman JSON'u döndürdüğünden nasıl emin olunur?

Ben Postacı / başlığını Kabul ekler farkındayım. Bu yüzden sorum şu: Atılmış bir HttpError, ResponseStatus'u her zaman, istekte bulunan Accept üstbilgisi ne olursa olsun JSON olarak döndürmesini nasıl sağlayabilirim?

setconfig: istekte bir Accept başlık yok olduğunda

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 
     }); 

Anladığım kadarıyla

, DefaultContentType sadece kullanılır.

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."); 
     }); 

cevap

2

HTTP Accept başlık istemci Tepki Tipi döndürülmesi gerektiğini belirtmek için kullandığı şeydir ama her zaman bir Küresel talep Filtre ekleme ve açıkça ayarlayarak JSON dönmek için bu geçersiz kılabilirsiniz ResponseContentType, örneğin: Accept Başlık belirli Tepki o PreferredContentTypes kullanarak varsayılan olacaktır Tip belirtmezse

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

gi Bir değişiklik ile:

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

Bizim son kullanıcıların büyük çoğunluğu JSON tercih edecektir, biz doğrulama XML organları aynı tür uygulamaya rahatsız etmez görerek, JSON şema kullanarak herhangi istek gövdelerini doğrulayarak ve edilmektedir. GlobalRespnoseFilter'ım için 'request.ResponseContentType = MimeTypes.Json;' ekledim. Ancak, PreRequestest filtresimde bir HttpError atarsam, GlobalResponseFilter asla çalıştırılmaz. Bu yüzden yanıtımdaki aynı İçerik Uzunluğu ve İçerik Türü'nü almaya devam ediyorum. "Zorla" İçerik türünü PreRequestestFilter içine eklerseniz, hizmetimin parametrelerinin özellikleri sıfırdır. – jk1990

+0

Sadece cevabınızı okudum ve fark ettim ki, Global ** İstek ** Filtresini yazdınız :) Ama GlobalRequestFilter yerine GlobalResponseFilter satırını ekledikten sonra, sonuç aynı – jk1990

+0

Düzenleme: Tam olarak ** aynı ** : // (ve tabii ki uygulama/json) dışındaki bir Accept üstbilgi değeriyle yapılan tüm istekler artık beklenen ResponseStatus hatası ile yanıt verir. Ancak, son kullanıcılarımızın API'mızı denemek için Postman'ı kullanacağını ve Postman'ın varsayılan Accept başlığının / olduğundan, henüz% 100 çözülmediğini umuyoruz. Ps .: = * – jk1990