2012-08-07 10 views
6

ServiceStack kullanma ile Modifiye yoktu, ben de 304 gibi Değiştirilmedi dönmek istiyorum:Önlemek istenmeyen başlıkları ServiceStack

HTTP/1.1 304 Not Modified 

Fakat ServiceStack birçok istenmeyen diğer başlıklarından (304 kod ile HttpResult dönen) ekler gibi:

HTTP/1.1 304 Not Modified 
Content-Length: 0 
Content-Type: application/json 
Server: Microsoft-HTTPAPI/2.0 
X-Powered-By: ServiceStack/3.94 Win32NT/.NET 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Headers: Content-Type 
Date: Tue, 07 Aug 2012 13:39:19 GMT 

Diğer başlıkların çıktısını nasıl önleyebilirim? Bir dummy içerik türü filtre kaydeden, HttpResult ile çeşitli yaklaşımları denedim, ancak adından da anlaşılacağı gibi sadece içeriği kontrol eder, üstbilgiler veya here listelenen diğerleri. Aynı sonuçları içeren IStreamWriter ve IHasOptions ile kendi IHttpResult türevimi uygulamayı denedim: ServiceStack istenmeyen üstbilgiler ekler.

Teşekkür

Güncelleme

aşağıdakileri kullanarak content-type kaldırmak mümkün oldu, ancak bazı başlıklar hala mevcut yani content-length, server ve date bulunmaktadır. ServiceStack yaydığı

public override object OnGet(FaultTypes request) 
    { 
     var result = new HttpResult 
     { 
     StatusCode = HttpStatusCode.NotModified, 
     StatusDescription = "Not Modified", // Otherwise NotModified written! 
     }; 

     // The following are hacks to remove as much HTTP headers as possible 
     result.ResponseFilter = new NotModifiedContentTypeWriter(); 
     // Removes the content-type header 
     base.Request.ResponseContentType = string.Empty; 

     return result; 
    } 

class NotModifiedContentTypeWriter : ServiceStack.ServiceHost.IContentTypeWriter 
{ 
    ServiceStack.ServiceHost.ResponseSerializerDelegate ServiceStack.ServiceHost.IContentTypeWriter.GetResponseSerializer(string contentType) 
    { 
    return ResponseSerializerDelegate; 
    } 

    void ServiceStack.ServiceHost.IContentTypeWriter.SerializeToResponse(ServiceStack.ServiceHost.IRequestContext requestContext, object response, ServiceStack.ServiceHost.IHttpResponse httpRes) 
    { 
    } 

    void ServiceStack.ServiceHost.IContentTypeWriter.SerializeToStream(ServiceStack.ServiceHost.IRequestContext requestContext, object response, System.IO.Stream toStream) 
    { 
    } 

    string ServiceStack.ServiceHost.IContentTypeWriter.SerializeToString(ServiceStack.ServiceHost.IRequestContext requestContext, object response) 
    { 
    return string.Empty; 
    } 

    public void ResponseSerializerDelegate(ServiceStack.ServiceHost.IRequestContext requestContext, object dto, ServiceStack.ServiceHost.IHttpResponse httpRes) 
    { 
    } 
} 

cevap

8

sadece başlıkları EndpointHostConfig.GlobalResponseHeaders kayıtlı olanlardır.

SetConfig(new EndpointHostConfig { 
    GlobalResponseHeaders = new Dictionary<string,string>() 
}); 

Bir HttpResult kullanarak bir anlık-bazda ekleyebilirsiniz, örneğin:

return new HttpResult(dto) { 
    Headers = { 
     { "Access-Control-Allow-Origin", "*" }, 
     { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" } 
     { "Access-Control-Allow-Headers", "Content-Type" }, } 
}; 

Her iki seçenek açıklanmıştır bunları örneğin yayılan istemiyorsanız

bunları kaldırın daha fazla ayrıntı: servicestack REST API and CORS

+0

Yanıt için teşekkürler, ancak bu yalnızca CORS'leri değil, diğerlerini de kaldırır. Hala HTTP/1.1 304 Modifiye Edilmedi Içerik-Uzunluk: 0 Içerik-Tür: uygulama/json Son Tarih: Perşembe, 16 Ağustos 2012 16:20:25 GMT Sunucu: Microsoft-HTTPAPI/2.0 Tarih: Per, 16 Ağustos 2012 16:20:24 GMT –

+0

"GlobalResponseHeaders" içinde olmayan veya "HttpResult" ile hizmet bazında kendinizi ekleyen yayındaki başlıklar ServiceStack'tan değil. IIS/ASP.NET kendi başlıklarını eklemeyi seçebilir. – mythz

+0

IIS/ASP.Net kullanılmıyor, sadece konsol uygulaması testi. JSON seri hale getirici ve diğerleri eklendi. Bunları nasıl kontrol edebilirim? –

0

Aslında sadece API böyle bir şey yapabileceği

base.Response.StatusCode = (int) HttpStatusCode.NotModified; 
base.Response.EndHttpRequestWithNoContent(); 
return new HttpResult(); 

ContentType, ContentLength vb. Döndürmez.