Замена ServiceStack для WCF - PullRequest
1 голос
/ 03 мая 2019

В настоящее время я использую клиент командной строки, который связывает WCF для связи между клиентом (через http) и веб-сервером IIS. Пакеты запросов WCF очень большие (например, 10 ГБ). Могу ли я использовать служебный стек для передачи запросов размером в ГБ (которые включают в себя большой сжатый пакет данных как часть запроса)?

1 Ответ

1 голос
/ 03 мая 2019

Для очень больших файлов наиболее эффективным способом является выгрузка файла в виде HTTP File Upload (т.е. multipart / form-data).Если вместо этого вы хотите отправлять большие запросы API, наиболее эффективным форматом для двоичных данных является Протокол буфера или Пакет сообщений .

Но обычно вы отправляете большиефайлы данных через HTTP File Upload.ServiceStack не накладывает никаких ограничений на размер самой загрузки, поэтому любые ограничения будут налагаться на базовый HTTP-сервер.Я бы порекомендовал начать с одного из базовых шаблонов проектов .NET , базовый HTTP-сервер Kestrel которого более эффективен, чем HTTP-серверы ASP.NET или HttpListener, доступные в .NET Framework.

В есть примеры быстрой загрузки файлов документы:

Загрузка файлов

Вы можете получить доступ к загруженным файлам независимо от запроса DTO, используя Request.Files.Например:

public object Post(MyFileUpload request)
{
    if (this.Request.Files.Length > 0)
    {
        var uploadedFile = base.Request.Files[0];
        uploadedFile.SaveTo(MyUploadsDirPath.CombineWith(file.FileName));
    }
    return HttpResult.Redirect("/");
}

ServiceStack imgur.servicestack.net В примере показано, как получить доступ к потоку байтов нескольких загруженных файлов , например:

public object Post(Upload request)
{
    foreach (var uploadedFile in base.Request.Files
       .Where(uploadedFile => uploadedFile.ContentLength > 0))
    {
        using (var ms = new MemoryStream())
        {
            uploadedFile.WriteTo(ms);
            WriteImage(ms);
        }
    }
    return HttpResult.Redirect("/");
}

Request.Files - это коллекция загруженных файлов, предоставляемая базовым HTTP-сервером, т.е. ServiceStack не буферизирует никакое содержимое.

Вы можете загружать HTTP-файлы, используя HTTP Utils PostFileToUrl () или UploadFile () API .Сервисные клиенты ServiceStack C # также имеют ряд API загрузки файлов , где вы можете отправить несколько загрузок файлов, а также заполненный запрос DTO с несколькими загрузками файлов:

Загрузка файлов

Вы можете использовать PostFile API для загрузки одного файла с указанием маршрута службы, которую вы хотите вызвать, имени файла и Stream его содержимого, например:

var client = new JsonServiceClient(baseUrl);
using (var fileStream = new FileInfo(filePath).OpenRead())
{
    var fileName = "upload.html";
    var response = client.PostFile<FileUploadResponse>("/files/upload", 
        fileStream, fileName, MimeTypes.GetMimeType(fileName));
}

Файлы, загруженные с помощью PostFile* API, загружаются как HTTP POST, используя multipart/form-data Content-Type, к которому можно получить доступ из коллекции IRequest.Files в ваших Сервисах, например:

[Route("/files/upload")]
public class UploadFile {}

public class UploadFileService : Service
{
    readonly string UploadsDir = "uploads";

    public object Post(UploadFile request)
    {
        var uploadedFile = base.Request.Files[0];
        VirtualFiles.WriteFile(UploadsDir.CombineWith(uploadedFile.FileName), uploadedFile.InputStream);
        return new FileUploadResponse { ... };
    }
}

Вы можетеиспользуйте API PostFileWithRequest. Для добавления дополнительных метаданных в загрузку файлов, например:

[DataContract]
[Route("/files/upload")]
public class FileUpload : IReturn<FileUploadResponse>
{
    [DataMember]
    public int CustomerId { get; set; }

    [DataMember]
    public DateTime CreatedDate { get; set; }
}

var client = new JsonHttpClient(baseUrl);
var fileInfo = new FileInfo(filePath);
using (var fileStream = fileInfo.OpenRead())
{
    var request = new FileUpload {
        CustomerId = customerId,
        CreatedDate = fileInfo.CreationTimeUtc,
    };

    var response = client.PostFileWithRequest<FileUploadResponse>(
        "/files/upload", fileStream, fileInfo.Name, request);
}

Загрузка нескольких файлов

API PostFilesWithRequest, доступные на всех клиентах службы .NET, позволяют вамлегко загружать несколько потоков в рамках одного HTTP-запроса.Он поддерживает заполнение запроса DTO любой комбинацией QueryString и POST-формы FormData в дополнение к нескольким потокам данных загрузки файлов:

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.JsonHttpClient также включает асинхронные эквиваленты для каждого из PostFilesWithRequest API:

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),
        });
}
...