2012-08-07 13 views
6

ServiceStack का उपयोग के साथ संशोधित नहीं, मैं सिर्फ वापस जाने के लिए 304 संशोधित नहीं जैसे हैं:रोकें अवांछित हेडर जब 304 लौटने ServiceStack

HTTP/1.1 304 Not Modified 

लेकिन ServiceStack कई अन्य अवांछित हेडर (304 कोड के साथ HttpResult लौटने) कहते हैं जैसे:

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 

मैं अन्य शीर्षकों को आउटपुट से कैसे रोक सकता हूं? मैंने HttpResult के साथ विभिन्न दृष्टिकोणों की कोशिश की है, जो एक डमी सामग्री प्रकार फ़िल्टर पंजीकृत करते हैं, लेकिन जैसा कि इसका नाम केवल सामग्री को नियंत्रित करता है, हेडर नहीं, या अन्य here सूचीबद्ध हैं। मैंने अपने स्वयं के IHttpResult व्युत्पन्न को ISTreamWriter और IHasOptions के साथ एक ही परिणाम के साथ कार्यान्वित करने का प्रयास किया है: सर्विसस्टैक अवांछित शीर्षलेख जोड़ता है।

धन्यवाद

अद्यतन

निम्नलिखित का उपयोग करके content-type हटाने में सक्षम था, लेकिन कुछ हेडर अभी भी मौजूद अर्थात content-length, server, और 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) 
    { 
    } 
} 

उत्तर

8

केवल हेडर ServiceStack द्वारा उत्सर्जित EndpointHostConfig.GlobalResponseHeaders में पंजीकृत होते हैं।

उन्हें निकालें यदि आप उन्हें उत्सर्जित, जैसे नहीं करना चाहती:

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

आप एक HttpResult का उपयोग कर का सहारा-आधार पर उन्हें जोड़ सकते हैं, जैसे:

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

दोनों विकल्पों में विस्तार से बताया पर और अधिक विस्तार: servicestack REST API and CORS

+0

जवाब के लिए धन्यवाद, लेकिन यह केवल CORS, दूसरों को नहीं निकाल देता है। मैं अभी भी 1.1 304 संशोधित सामग्री-लंबाई नहीं HTTP/है: 0 सामग्री प्रकार: आवेदन/json समाप्ति: गुरु, 16 अगस्त 2012 16:20:25 GMT सर्वर: माइक्रोसॉफ्ट HTTPAPI/2.0 दिनांक: गुरु, 16 अगस्त 2012 16:20:24 GMT –

+0

उत्सर्जित शीर्षलेख जो 'ग्लोबल रीस्पॉन्सहेडर' में नहीं हैं या 'HttpResult' के साथ प्रति-सेवा आधार पर स्वयं को शामिल करते हैं, सर्विसस्टैक से नहीं हैं। आईआईएस/एएसपी.नेट अपने ही शीर्षकों को जोड़ना चुन सकता है। – mythz

+0

आईआईएस/एएसपी.Net का उपयोग नहीं कर रहा है, बस कंसोल ऐप परीक्षण। जेएसओएन सीरिएलाइज़र और अन्य से जोड़ा गया लगता है। मैं इन्हें कैसे नियंत्रित कर सकता हूं? –

0

वास्तव में आप सिर्फ अपने एपीआई में कुछ इस तरह कर सकते हैं

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

कौन सा ContentType में ContentLength वापस नहीं होगा, आदि

संबंधित मुद्दे