2012-08-07 59 views
6

使用ServiceStack修改,我只是想回到304未修改這樣:返回304時,爲防止不必要的報頭不能與ServiceStack

HTTP/1.1 304 Not Modified 

但ServiceStack增加了許多其他有害(返回HttpResult有304碼)頭因此:

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。我也試着用IStreamWriter和IHasOptions實現我自己的IHttpResult衍生產品,結果相同:ServiceStack添加了不需要的標頭。

感謝

更新

之所以能夠通過使用以下刪除content-type,但一些頭依然存在,即content-lengthserver,並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,而不是其他的。我仍然有HTTP/1.1 304未修改 內容長度:0 內容類型:application/json 過期時間:2012年8月16日星期四16:20:25 GMT 服務器:Microsoft-HTTPAPI/2.0 Date:Thu, 2012年8月16日16:20:24 GMT – 2012-08-16 16:21:02

+0

不在'GlobalResponseHeaders'中的發出的頭文件或使用'HttpResult'在每個服務基礎上添加的頭文件不是來自ServiceStack。 IIS/ASP.NET可能會選擇添加自己的標題。 – mythz 2012-08-16 16:23:35

+0

不使用IIS/ASP.Net,只是控制檯應用程序測試。似乎從JSON序列化器和其他添加。我如何控制這些? – 2012-08-16 16:29:43

0

其實你可以在你的API中做這樣的事情

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

哪個不會返回ContentType,ContentLength等

相關問題