Отправка запроса на отдых с файлом (ами) и JSON (Restsharp) в Framework и Standard - PullRequest
0 голосов
/ 15 мая 2018

В настоящее время у меня есть созданная оболочка, в которой используется функция (SendEmail) для отправки полезной нагрузки JSON и нескольких файлов в функцию Azure в конечной точке Http. Однако, когда я использую Restsharp 106.2.2 для отправки моего запроса, кажется, что информация о границах не предоставляется. Когда моя функция Azure получает вызов и пытается установить MultipartMemoryStreamProvider, она не может этого сделать, потому что не видит границ.

Консольное тестовое приложение

private static void Main(string[] args)
{
    var emailService = new EmailService();
    var email = new MicroserviceMailMessage("from@test.com", "to@test.com",
        "Test Subject from Framework App", "Test Body from Framework App", true, DateTime.Now);
    email.Attachments.Add(new Attachment(@"c:\Temp\soccor5.jpg"));

    emailService.SendEmail(email);
}

Библиотека Wrapper

public void SendEmail(MicroserviceMailMessage email)
{
    var client = new RestClient("http://localhost:7071/api");
    var request = new RestRequest("SendEmail", Method.POST);

    var transformedEmail = TransformEmail(email);

    request.AlwaysMultipartFormData = true;
    request.AddHeader("Content-Type", $"multipart/form-data");

    foreach (var attachment in email.Attachments)
    {
        var inline = attachment.ContentDisposition.Inline ? "inline." : "";
        request.Files.Add(new FileParameter
        {
            Name = $"attachments.{inline}{attachment.Name}",
            Writer = (s) =>
            {
                attachment.ContentStream.CopyTo(s);
                attachment.ContentStream.Dispose();
            },
            ContentType = attachment.ContentType.ToString(),
            ContentLength = attachment.ContentStream.Length,
            FileName = attachment.Name
        });
    }

    request.AddParameter("email", $"{JsonConvert.SerializeObject(transformedEmail)}", ParameterType.RequestBody);
    IRestResponse response = client.Execute(request);
}

Функция Azure Reciever

[FunctionName("EmailReceiver")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, ...)
{
    ...
    var provider = new MultipartMemoryStreamProvider();
    await req.Content.ReadAsMultipartAsync(provider) // Fails on this line
    ...
}

Сравнение данных выборки

Использование RestSharp 106.2.2 Data with RestSharp 106.2.2

Использование RestSharp 105.2.3 (Схожие результаты с почтальоном) Data with RestSharp 105.2.3

Error

Указан неверный экземпляр HttpContent. Не имеет 'multipart' заголовок типа контента с границей параметр. \ r \ nИмя параметра: содержимое

Что я пробовал до сих пор:

Возвращение Restsharp к 105.2.3 возвращает информацию о границе в запросе Rest, и это прекрасно работает для .Net Framework, но мне нужно, чтобы оболочка была кросс-совместимой между Framework и .Net Standard, так что это не полностью решит мою проблему. проблема.

Идеи? Я пытался подумать, есть ли какой-нибудь способ, которым я могу вручную ввести границы с Restsharp 106.2.2, но я не могу найти много документации по нему.

1 Ответ

0 голосов
/ 16 мая 2018

Это не прямой ответ, а просто решение, которое я нашел, чтобы обойти проблему.

Я перешел на Flurl.Http, последняя версия которого совместима со Standard и Framework. Вот как я переписал свою функцию SendEmail,

public void SendEmail(MicroserviceMailMessage email)
{
    var url = _azureEndpoint;
    var transformedEmail = TransformEmail(email);

    var content = new CapturedMultipartContent();
    content.AddJson("email", transformedEmail);

    foreach (var attachment in email.Attachments)
    {
        var inline = attachment.ContentDisposition.Inline ? "inline." : "";
        content.AddFile($"attachments.{inline}{attachment.Name}", attachment.ContentStream, attachment.Name);
    }

    url.PostAsync(content).Wait();
}

Он публикует все, что мне нужно, файлы и JSON.

...