2017-03-17 4 views
1

サービススタック3 - ?format = csvの添付ファイルのファイル名は、応答ごとにどのようにカスタマイズできますか?ServiceSTack:CSVファイル名

私はこれを知りましたが、唯一の記事ではフォーマットプロバイダ全体を置き換えることを提案しましたが、これは非常に極端なようです。

答えて

2

あなたがCsvFormatを置き換えるためにカスタマイズされた振る舞いをしたい場合には、わずか数行のコードである極端ではありません。返されるファイル名がリクエストDTO名前になりますが、あなたはそれを変更することができますデフォルトで

public class CsvFormat : IPlugin 
{ 
    public void Register(IAppHost appHost) 
    { 
     //Register the 'text/csv' content-type and serializers (format is inferred from the last part of the content-type) 
     appHost.ContentTypes.Register(MimeTypes.Csv, 
      SerializeToStream, CsvSerializer.DeserializeFromStream); 

     //Add a response filter to add a 'Content-Disposition' header so browsers treat it natively as a .csv file 
     appHost.GlobalResponseFilters.Add((req, res, dto) => 
     { 
      if (req.ResponseContentType == MimeTypes.Csv) 
      { 
       res.AddHeader(HttpHeaders.ContentDisposition, $"attachment;filename={req.OperationName}.csv"); 
      } 
     }); 
    } 

    public void SerializeToStream(IRequest requestContext, object request, Stream stream) 
    { 
     CsvSerializer.SerializeToStream(request, stream); 
    } 
} 

あなたが最初に例えば、あなた自身を登録し、その後、予め登録CsvFormatを削除することで追加することができ、独自のカスタムCsvFormatとあなたが望むものは何でも利用:

Plugins.RemoveAll(x => x is CsvFormat); 

Plugins.Add(new MyCsvFormat()); 
+0

ありがとうございます。私はプロバイダが簡単なシェルであることを認識しませんでした。 – SAJ14SAJ

1

はまた、要求を設定することで、サービスの方法でファイル名を設定することができます。 OperationName 。このように:

public object Any(RequestWithFilename request) 
    { 
     ... 

     if (!string.IsNullOrWhiteSpace(request.Filename)) 
      Request.OperationName = request.Filename; 

     ... 
    }