Rebecca
Rebecca

Reputation: 14412

What is the PostFileWithRequest equivalent in ServiceStack's 'New API'?

I want to post some request values alongside the multipart-formdata file contents. In the old API you could use PostFileWithRequest:

[Test]
public void Can_POST_upload_file_using_ServiceClient_with_request()
{
    IServiceClient client = new JsonServiceClient(ListeningOn);
    var uploadFile = new FileInfo("~/TestExistingDir/upload.html".MapProjectPath());
    var request = new FileUpload{CustomerId = 123, CustomerName = "Foo"};

    var response = client.PostFileWithRequest<FileUploadResponse>(ListeningOn + "/fileuploads", uploadFile, request);

    var expectedContents = new StreamReader(uploadFile.OpenRead()).ReadToEnd();

    Assert.That(response.FileName, Is.EqualTo(uploadFile.Name));
    Assert.That(response.ContentLength, Is.EqualTo(uploadFile.Length));
    Assert.That(response.Contents, Is.EqualTo(expectedContents));
    Assert.That(response.CustomerName, Is.EqualTo("Foo"));
    Assert.That(response.CustomerId, Is.EqualTo(123));
}

I can't find any such method in the new API, nor any overrides on client.Post() which suggest that this is still possible. Does anyone know if this is a feature that was dropped?

Update

As @Mythz points out, the feature wasn't dropped. I had made the mistake of not casting the client:

private IRestClient CreateRestClient()
{
    return new JsonServiceClient(WebServiceHostUrl);
}

[Test]
public void Can_WebRequest_POST_upload_binary_file_to_save_new_file()
{
    var restClient = (JsonServiceClient)CreateRestClient(); // this cast was missing
    var fileToUpload = new FileInfo(@"D:/test/test.avi");
    var beforeHash = this.Hash(fileToUpload);

    var response = restClient.PostFileWithRequest<FilesResponse>("files/UploadedFiles/", fileToUpload, new TestRequest() { Echo = "Test"});

    var uploadedFile = new FileInfo(FilesRootDir + "UploadedFiles/test.avi");
    var afterHash = this.Hash(uploadedFile);

    Assert.That(beforeHas, Is.EqualTo(afterHash));
}

private string Hash(FileInfo file)
{
    using (var md5 = MD5.Create())
    {
        using (var stream = file.OpenRead())
        {
            var bytes = md5.ComputeHash(stream);
            return BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "").ToLower();
        }
    }
}

Upvotes: 1

Views: 688

Answers (1)

mythz
mythz

Reputation: 143339

None of the old API was removed from the C# Service Clients, only new API's were added.

The way you process an uploaded file inside a service also hasn't changed.

Upvotes: 1

Related Questions