C# 在框架和标准上发送带有文件和JSON(Restsharp)的Rest请求

C# 在框架和标准上发送带有文件和JSON(Restsharp)的Rest请求,c#,azure,microservices,azure-functions,restsharp,C#,Azure,Microservices,Azure Functions,Restsharp,我目前正在构建一个包装器,它使用一个函数(SendEmail)将JSON负载和一些文件发送到Http端点的Azure函数。但是,当我使用Restsharp 106.2.2发送请求时,似乎没有提供边界信息。当my Azure函数收到调用并尝试设置MultipartMemoryStreamProvider时,它无法设置,因为它看不到任何边界 控制台测试应用程序 private static void Main(string[] args) { var emailService = new E

我目前正在构建一个包装器,它使用一个函数(SendEmail)将JSON负载和一些文件发送到Http端点的Azure函数。但是,当我使用Restsharp 106.2.2发送请求时,似乎没有提供边界信息。当my 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
    ...
}
[FunctionName(“EmailReceiver”)]
公共静态异步任务运行([HttpTrigger(AuthorizationLevel.Function,“post”,Route=null)]HttpRequestMessage请求,…)
{
...
var provider=新的MultipartMemoryStreamProvider();
wait req.Content.ReadAsMultipartAsync(provider)//此行失败
...
}
样本数据比较

[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(与邮递员的结果类似)

错误

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

到目前为止我所尝试的:

将Restsharp恢复到105.2.3会在Rest请求中恢复边界信息,这对.Net Framework非常有用,但我需要包装器在Framework和.Net标准之间实现交叉兼容,因此这并不能完全解决我的问题


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

这不是一个直接的答案,而只是我提出的解决问题的解决方案

我切换到Flurl.Http,它的最新版本与标准和框架兼容。这就是我重写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