2012-08-07 13 views
6

Utilizzando ServiceStack, voglio solo tornare 304 Non modificato come tale:Prevenire intestazioni indesiderate quando ritornano 304 Not Modified con ServiceStack

HTTP/1.1 304 Not Modified 

Ma ServiceStack aggiunge molte altre indesiderata (tornando HttpResult con 304 codice) intestazioni come tale:

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 

Come impedire l'emissione di altre intestazioni? Ho provato vari approcci con HttpResult, registrando un filtro di tipo contenuto fittizio, ma poiché il suo nome implica solo il contenuto dei controlli, non le intestazioni o altri elencati here. Ho anche provato a implementare il mio derivato IHttpResult con IStreamWriter e IHasOptions con gli stessi risultati: ServiceStack aggiunge intestazioni indesiderate.

Grazie

Aggiornamento

e 'stato in grado di rimuovere content-type utilizzando la seguente, ma alcune intestazioni sono ancora presenti cioè content-length, server e date.

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

risposta

8

Le uniche intestazioni emessi dai ServiceStack sono quelli registrati nella EndpointHostConfig.GlobalResponseHeaders.

rimuoverli se non si vuole loro emessi, ad esempio:

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

è possibile aggiungere un adhoc-base utilizzando un HttpResult, ad esempio:

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

Entrambe le opzioni spiegate in più in dettaglio: servicestack REST API and CORS

+0

Grazie per la risposta, ma questo rimuove solo i CORS, non gli altri. Ho ancora HTTP/1.1 304 non modificato Content-Length: 0 Content-Type: application/json Scade: gio 16 ago 2012 16:20:25 GMT Server: Microsoft-HTTPAPI/2.0 Data: Thu, 16 Ago 2012 16:20:24 GMT –

+0

Le intestazioni emesse che non sono in "GlobalResponseHeaders" o aggiunte personalmente per ogni servizio con "HttpResult" non provengono da ServiceStack. IIS/ASP.NET può scegliere di aggiungere le proprie intestazioni. – mythz

+0

Non si utilizza IIS/ASP.Net, solo test dell'app per console. Sembra aggiunto da serializzatore JSON e altri. Come posso controllarli? –

0

in realtà si può semplicemente fare qualcosa di simile nella vostra API

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

Quale non restituisce ContentType, ContentLength, ecc

Problemi correlati