2013-07-07 31 views
11

Büyük bir korsanlık olmadan, Runner içinde bir ServiceStack isteğinin ham istek gövdesini almak mümkün mü?ServiceStack Runner İstek Gövde Olabilir mi?

Yeni API (Service and Runner) kullanarak ServiceStack'ın üzerinde çalışmak için bir oauth servis sağlayıcısı yazıyorum. OAuth imzalama çalışmaları nedeniyle, her istek için ham istek gövdesini almam gerekir. OAuth koruma katmanı, Runner'a eklenir; böylece geçersiz bir OAuth isteği, Service sınıfında herhangi bir boyar plakası olmadan veya özel bir "OAuthService" sınıfının alt sınıflarını içermeyen boş/hata yanıtını kolayca döndürür.

cevap

15

Ham İstek Kuruluşuna erişim yolu IHttpRequest.GetRawBody() veya IHttpRequest.InputStream'dan okunabilir.

Ancak, HTTP Request gövdesi ileriye doğru bir akış olduğundan, varsayılan olarak yalnızca ServiceStack tarafından İstek DTO'sunun seri hale getirilmesi için çağrılan bir kez çağrılabilir. Serialization and Deserialization docs İsteği deserializing atlamak için ServiceStack söylemek ve birlikte talep DTO içine okunmamış İsteği Akışı enjekte nasıl gösterir:

public class Hello : IRequiresRequestStream 
{ 
    /// <summary> 
    /// The raw Http Request Input Stream 
    /// </summary> 
    Stream RequestStream { get; set; } 
} 

yine ServiceStack Talebi DTO serisini aynı zamanda size gereken ham istek gövdesini erişmek istiyorsanız Eğer PreRequestFilter ekleyerek yapabilirsiniz, hangi onun okuma önce talebi tampon ServiceStack anlatmak için: şimdi httpReq.GetRawBody() birden çok kez arayabilir veya artık tamponlu beri IHttpRequest.InputStream doğrudan okumasına olanak sağlar

appHost.PreRequestFilters.Insert(0, (httpReq, httpRes) => { 
    httpReq.UseBufferedStream = true; 
}); 

.

+0

Bu, şu anda yaptığım şeyden çok daha fazlasıdır, ancak IHttpRequest'i IRequestContext'ten almayı tercih ettiğim, açık nedenlerle yapmak istemediğim yansımayı kullanmak zorundaydım. IHttpRequest'i IServiceRunner .Execute yönteminin içinden almak için bir yol var mı? –

+1

Yansıma? İsteğinizi almak için 'requestContext.Get () 'seçeneğini kullanın. – mythz

+0

@mythz 'httpReq.UseBufferedStream = true;' üretimde güvenli mi? Yoksa bu normal olarak önerilmiyor mu? – vonec