14

ServiceStackを使用して、ファイルを RESTful な方法で ServiceStack クライアントに返そうとしています。

HttpResult と FileInfo オブジェクトまたは MemoryStream を使用して、ContentType ヘッダーを関連するファイル タイプに変更できるようにすることをアドバイスするSO ( hereおよびhere )に関する他の質問を読みました。

これは、ブラウザ経由でサービスを呼び出すと機能し、正しいファイルのダウンロードが自動的に開始されます。ただし、ServiceStack クライアントの 1 つを使用してファイルを使用するにはどうすればよいですか?

私は Request DTO を使用しており、次のようなものを使用して返そうとしています

return new HttpResult(new FileInfo("file.xml"), asAttachment:true) {
   ContentType = "text/xml"
};

たとえば、これを JsonServiceClient でどのように消費しますか?

4

4 に答える 4

13

主に DTO を送信するためのものであるため、 ServiceStack の .NET ServiceClientsでファイルを使用することはありません。

通常の WebRequest を使用してファイルをダウンロードできます。ServiceStack の v3.9.33 では、これを簡単にするいくつかの便利な WebRequest 拡張 HTTP Utilsが導入されました。

テキスト ファイルの場合:

var xmlFile = downloadUrl.GetXmlFromUrl(responseFilter: httpRes => {
        var fileInfoHeaders = httpRes.Headers[HttpHeaders.ContentDisposition];
    });

fileInfoHeaders にW3C ContentDisposition HTTP ヘッダーが含まれている場合、たとえば を返す場合FileInfoServiceStack は次を返します

attachment;filename="file.xml";size={bytesLen};
creation-date={date};modification-date={date};read-date={date};

バイナリファイルをダウンロードするには、次を使用できます。

var rawBytes = downloadUrl.GetBytesFromUrl(httpRes => ...);
于 2013-01-04T05:09:30.900 に答える
1

以下のように、応答フィルターを使用して、処理される前に応答を傍受できます。

ServiceClientBase.HttpWebResponseFilter = response =>
{
    if (response.Headers["Content-Disposition"] != null)
    {
        var t = response.DownloadText();
        Console.WriteLine(t);
    }
};

ただし、これはそれを処理する最良の方法ではありません。クライアントが応答ストリームを読み込もうとすると、への実際の呼び出しclient.Method()が発生するためです (以前に によって読み取られているためです。処理方法はまだわかりません)。優雅にですが、もしそうなら答えを更新します。ArgumentExceptionresponse.DownloadFile(...)

于 2013-01-03T11:55:55.163 に答える