How to consume a file with a ServiceStack client

后端 未结 4 664
盖世英雄少女心
盖世英雄少女心 2021-02-01 23:34

I am trying to use ServiceStack to return a file to a ServiceStack client in a RESTful manner.

I have read other questions on SO (here and here) which advise using HttpR

4条回答
  •  栀梦
    栀梦 (楼主)
    2021-02-02 00:01

    I have found mythz answer to work well, but it is also possible to use their built in JSonServiceClient to also process file requests as well, just in a slightly non-intuitive way because you can't actually use the return type you would expect.

    For a model definition like this:

    [Route("/filestorage/outgoing/{Name}.{Extension}", "GET")]
    [Route("/filestorage/outgoing", "GET")]
    public class GetFileStorageStream : IReturn
    {
        public string Name { get; set; }
        public string Extension { get; set; }
        public bool ForDownload { get; set; }
    }
    

    You can define your service to return an HttpResult:

    public class FileStorageService : Service
    {
        public HttpResult Get(GetFileStorageStream fileInformation)
        {
            var internalResult = GetFromFileStorage(fileInformation);
            var fullFilePath = Path.Combine("C:\Temp", internalResult.FileName);
            return new HttpResult(new FileInfo(fullFilePath), asAttachment: fileInformation.ForDownload);
        }
    }
    

    Then on the client side you can use this Get template to properly get the web context:

    var client = new JsonServiceClient("http://localhost:53842");
    var httpResponse = client.Get("/filestorage/outgoing/test.jpg");
    pictureBox1.Image = Image.FromStream(httpResponse.GetResponseStream());
    

    I found it was not possible to use the new API Get methods as they would attempt to deserialize the HttpResult which isn't actually a true return type but a class representing the web context that service stack has created.

提交回复
热议问题