65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Rest Sharp 将多个文件传递到 Service Stack Windows 服务

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.80/5 (2投票s)

2018年4月8日

CPOL

2分钟阅读

viewsIcon

13513

downloadIcon

278

使用 Rest Sharp 将多个文件传递到 Service Stack Windows 服务

引言

最近,我正在处理一个功能,即使用 REST API 将多个文件传递到 Service Stack Windows 服务。没有找到太多关于如何实现此功能的有用信息,所以我想分享我的经验。

我创建了两个应用程序,服务(Service Stack Windows 服务空项目)和 客户端(控制台应用程序)。

客户端将使用 REST API 将多个文件和其他参数传递到 Service Stack Windows 服务。然后,服务将读取这些文件并将它们保存到某个位置。

创建服务 - Service Stack Windows 服务空项目

步骤 1

打开 Visual Studio -> 工具 -> 扩展和更新.. 并安装 ServiceStackVS

第二步

创建一个新项目,命名为 - (ServiceStackWindowsService)

这将自动创建 ServiceStack Windows 服务所需的所有项目。以下是将被创建的项目

步骤 3

打开 ServiceStackWindowsService.ServiceModel 并创建一个 StreamFiles 类(DTO),实现 IRequiresRequestStream

StreamFiles 上添加 RouteAttribute,该属性将在客户端调用时使用。

using ServiceStack;
using ServiceStack.Web;

namespace ServiceStackWindowsService.ServiceModel
{
    [Route("/stream","Post")]
    public class StreamFiles : IRequiresRequestStream
    {
        public System.IO.Stream RequestStream { get; set; }
        public string OtherData1 { get; set; }
        public string OtherData2 { get; set; }
    }
}

步骤 4

打开 ServiceStackWindowsService.ServiceInterface 并在 MyServices.cs 中添加 Post 方法。

以下代码将从 Client 发送的 base.Request.Files 中读取文件,并将其保存到 C:\Temp 位置。

注意:请创建该文件夹,如果您想执行附加的代码,或者在运行服务之前在您的机器上提供其他位置。

using ServiceStack;
using ServiceStack.Web;
using ServiceStackWindowsService.ServiceModel;
using System.IO;

namespace ServiceStackWindowsService.ServiceInterface
{
    public class MyServices : Service
    {
        public object Any(Hello request)
        {
            return new HelloResponse { Result = $"Hello, {request.Name}!" };
        }

        public object Post(StreamFiles streamFiles)
        {
            string resultFile = "";
            IHttpFile[] files = base.Request.Files;
            for (int i = 0; i < files.Length; i++)
            {
                resultFile = Path.Combine(@"C:\Temp", files[i].FileName);

                if (File.Exists(resultFile))
                {
                    File.Delete(resultFile);
                }

                using (FileStream file = File.Create(resultFile))
                {
                    files[i].InputStream.Seek(0, SeekOrigin.Begin);
                    files[i].InputStream.CopyTo(file);
                }
            } 
            
            return new HttpResult(System.Net.HttpStatusCode.OK);
        }
    }
}

步骤 5

运行应用程序。该服务将在 https://:8088 上公开。

现在我们的 Service Stack Windows 服务已经准备就绪。让我们跳转到在客户端中使用服务。

创建客户端 - Windows 控制台应用程序

步骤 1

打开 Visual Studio 的新实例并创建一个 Windows -> 控制台应用程序

第二步

在 Windows 控制台应用程序上安装 REST Sharp Nuget 包 (https://nuget.net.cn/packages/RestSharp)

    PM > Install-Package RestSharp -Version 106.2.1

步骤 3

使用 REST 客户端在控制台应用程序中调用 Service Stack Windows 服务。为此,在客户端中编写以下内容

using RestSharp;
using System.IO;

namespace ServiceStackClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //Create Rest Client
            RestClient client = new RestClient("https://:8088");

            var restRequest = new RestRequest("/stream", Method.POST);

            restRequest.AddParameter("OtherData1","Value1");
            restRequest.AddParameter("OtherData2", "Value2");

            restRequest.AddHeader("Content-Length", int.MaxValue.ToString());

            //Convert File to Byte Array
            byte[] byteArray1 = File.ReadAllBytes(@"../../Files/custom.js");
            byte[] byteArray2 = File.ReadAllBytes(@"../../Files/Desert.jpg");

            //Add Files in Rest Request
            restRequest.AddFile("custom", byteArray1, "custom.js", "application/javascript");
            restRequest.AddFile("Desert", byteArray2, "Desert.jpg", "image/jpeg");

            IRestResponse response = client.Execute(restRequest);
            
            var content = response.Content;
        }
    }
}

步骤 4

运行客户端应用程序。

以下将在 C:\Temp 中输出

完成了!我们已经实现了该功能!!!

文章中附有示例代码。

© . All rights reserved.