6

ServiceStackを使用して、 304NotModifiedをそのまま返したいだけです。

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でさまざまなアプローチを試しましたが、その名前はコンテンツのみを制御し、ヘッダーやここにリストされているその他のものは制御しないことを意味します。また、IStreamWriterとIHasOptionsを使用して独自のIHttpResult派生物を実装しようとしましたが、同じ結果が得られました。ServiceStackは不要なヘッダーを追加します。

ありがとう

アップデート

以下を使用して削除できましたが、一部のヘッダー、つまり、、、がまだ存在していcontent-typeます。content-lengthserverdate

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

2 に答える 2

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" }, }
};

どちらのオプションについても、 servicestackRESTAPIとCORSで詳しく説明されています。

于 2012-08-07T14:53:52.773 に答える
0

実際には、APIでこのようなことを行うことができます

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

ContentType、ContentLengthなどを返さない

于 2014-05-28T19:49:20.353 に答える