4

ServiceStack.ServiceClient.Web.XmlServiceClient を使用して Web サービスに接続しています。リクエストに添付ファイルを追加する方法はありますか?

より詳しい情報:

私がしようとしているのは、Mono を使用しているため、Microsoft.Web.Services2 の使用を避けることです。XML 要求と共に XML データファイルをアップロードしようとしています。この質問のように: C# .net の Web サービス経由でレポート ユニットを jasperserver にアップロードする

4

1 に答える 1

15

ファイルをアップロードする最良の(そして最速の)方法は、通常のリクエスト変数としてエンコードするのではなく、ContentType multipart / form-dataを使用した通常のHTTPアップロードとしてWebサービスにアップロードすることです。つまり、HTMLフォームが現在ファイルをurl。

ServiceStackには、アップロードされたファイルをこのように処理するための組み込みサポートがあります。ServiceStackのRestFilesサンプルプロジェクトでこれを行う方法の完全な例です。

ServiceClientを使用してファイルをアップロードするには、次の例に示す.PostFile <T>()メソッドを使用できます。

var fileToUpload = new FileInfo(FilesRootDir + "TESTUPLOAD.txt");

var response = restClient.PostFile<FilesResponse>(WebServiceHostUrl + "files/README.txt",
    fileToUpload, MimeTypes.GetMimeType(fileToUpload.Name));

アップロードされたすべてのファイルは、SaveTo()メソッドで(ストリームまたはファイルとして)簡単に処理base.RequestContext.Filesできるコレクションを介して利用可能になります。

foreach (var uploadedFile in base.RequestContext.Files)
{
    var newFilePath = Path.Combine(targetDir.FullName, uploadedFile.FileName);
    uploadedFile.SaveTo(newFilePath);
}

同様に、ファイル応答を(添付ファイルとしてまたは直接)返すことに関連して、次のようなHttpResultでFileInfoを返す必要があります。

return new HttpResult(FileInfo, asAttachment:true);

複数のファイルのアップロード

PostFilesWithRequestすべての.NETサービスクライアントで利用可能なAPIを使用して、単一のHTTPリクエスト内で複数のストリームをアップロードすることもできます。複数のファイルアップロードデータストリームに加えて、 QueryString とPOSTされたFormData任意の組み合わせを要求DTOに入力することをサポートします。

using (var stream1 = uploadFile1.OpenRead())
using (var stream2 = uploadFile2.OpenRead())
{
    var client = new JsonServiceClient(baseUrl);
    var response = client.PostFilesWithRequest<MultipleFileUploadResponse>(
        "/multi-fileuploads?CustomerId=123",
        new MultipleFileUpload { CustomerName = "Foo,Bar" },
        new[] {
            new UploadFile("upload1.png", stream1),
            new UploadFile("upload2.png", stream2),
        });
}

型付きリクエストDTOのみを使用した例。また、各APIJsonHttpClientの非同期同等物も含まれています。PostFilesWithRequest

using (var stream1 = uploadFile1.OpenRead())
using (var stream2 = uploadFile2.OpenRead())
{
    var client = new JsonHttpClient(baseUrl);
    var response = await client.PostFilesWithRequestAsync<MultipleFileUploadResponse>(
        new MultipleFileUpload { CustomerId = 123, CustomerName = "Foo,Bar" },
        new[] {
            new UploadFile("upload1.png", stream1),
            new UploadFile("upload2.png", stream2),
        });
}
于 2011-11-28T18:56:58.447 に答える