【问题标题】:Sending Rest request with file(s) and JSON (Restsharp) on Framework and Standard在框架和标准上发送带有文件和 JSON (Restsharp) 的 Rest 请求
【发布时间】:2018-05-14 23:09:02
【问题描述】:

我目前正在构建一个包装器,它使用一个函数 (SendEmail) 将 JSON 有效负载和一些文件发送到 Http 端点的 Azure 函数。但是,当我使用 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);
}

包装库

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 接收器功能

[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

使用 RestSharp 105.2.3(与 Postman 的结果相似)

错误

提供的“HttpContent”实例无效。它没有 带有“边界”的“多部分”内容类型标头 参数。\r\n参数名称:内容

到目前为止我所做的尝试:

将 Restsharp 恢复到 105.2.3 会带回 Rest 请求中的边界信息,这对 .Net Framework 非常有用,但我需要包装器在 Framework 和 .Net Standard 之间交叉兼容,所以这不能完全解决我的问题问题。

想法?我一直在思考是否有某种方法可以手动输入 Restsharp 106.2.2 的边界,但我找不到很多关于它的文档。

【问题讨论】:

    标签: c# azure microservices azure-functions restsharp


    【解决方案1】:

    这不是直接的答案,而只是我想出的解决问题的解决方案。

    我切换到 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。

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 2017-08-31
      • 2023-03-29
      • 2016-11-02
      • 1970-01-01
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多