2012-08-07 11 views
6

verwenden, ich will nur zurück 304 Nicht als solche Modifiziert:verhindern, dass unerwünschte Header, wenn 304 Rückkehr ServiceStack Not Modified mit ServiceStack

HTTP/1.1 304 Not Modified 

Aber ServiceStack fügt viele andere unerwünschte (Rückkehr HttpResult mit 304 Code) headers als solcher:

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 

Wie kann ich verhindern, dass die anderen Header ausgegeben werden? Ich habe verschiedene Ansätze mit HttpResult versucht, einen Dummy-Inhaltstyp Filter registrieren, aber wie der Name impliziert nur Steuerinhalte, nicht die Header oder andere aufgeführt here. Ich habe auch versucht, mein eigenes IHttpResult Derivat mit IStreamWriter und IHasOptions mit den gleichen Ergebnissen zu implementieren: ServiceStack fügt unerwünschte Header hinzu.

Dank

aktualisieren

konnte content-type entfernen, indem die folgende verwenden, aber einige Header sind noch vorhanden heißt content-length, server und 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) 
    { 
    } 
} 

Antwort

8

Die nur durch ServiceStack emittiert Header sind die in der EndpointHostConfig.GlobalResponseHeaders registriert diejenigen.

sie entfernen, wenn Sie sie emittiert nicht wollen, zum Beispiel:

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

Sie sie auf einer Ad-hoc-Basis hinzufügen können eine HttpResult, zB:

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

Beide Optionen erläutert genauer an: servicestack REST API and CORS

+0

Danke für die Antwort, aber das entfernt nur die CORS, nicht die anderen. Ich noch habe HTTP/1.1 304 Not Content-Length Geändert: 0 Content-Type: application/json Gültig bis: Do., 16. August 2012 16.20.25 GMT Server: Microsoft-HTTPAPI/2.0 Datum: Thu, 16 Aug 2012 16:20:24 GMT –

+0

Die ausgegebenen Kopfzeilen, die nicht in 'GlobalResponseHeaders' sind oder sich mit' HttpResult' pro Dienst hinzugefügt haben, stammen nicht von ServiceStack. IIS/ASP.NET kann eigene Header hinzufügen. – mythz

+0

Nicht mit IIS/ASP.Net, nur Konsolen-App-Test. Scheint hinzugefügt von JSON Serializer und anderen. Wie kann ich diese kontrollieren? –

0

Eigentlich kann man nur in der API so etwas tun

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

Was nicht ContentType, ContentLength, etc. zurückgeben würde