当前位置: 首页 > 面试题库 >

从HttpClient提交文件和Json数据到webapi

丌官霖
2023-03-14
问题内容

我想将文件和json数据从HttpClient发送到Web api服务器。
我似乎无法通过有效载荷访问服务器中的json,只能作为json变量。

 public class RegulationFilesController : BaseApiController
    {
        public void PostFile(RegulationFileDto dto)
        {
            //the dto is null here
        }
    }

这是客户:

   using (var client = new HttpClient())
                {
                    using (var content = new MultipartFormDataContent())
                    {
                        client.BaseAddress = new Uri(ConfigurationManager.AppSettings["ApiHost"]);
                        content.Add(new StreamContent(File.OpenRead(@"C:\\Chair.png")), "Chair", "Chair.png");
                        var parameters = new RegulationFileDto
                        {
                            ExternalAccountId = "1234",
                        };
                        JavaScriptSerializer serializer = new JavaScriptSerializer();
                        content.Add(new StringContent(serializer.Serialize(parameters), Encoding.UTF8, "application/json"));

                            var resTask = client.PostAsync("api/RegulationFiles", content); //?ApiKey=24Option_key
                            resTask.Wait();
                            resTask.ContinueWith(async responseTask =>
                            {
                                var res = await responseTask.Result.Content.ReadAsStringAsync();


                            }
                                );

                    }
                }

您能否建议在相同的请求下如何访问文件和提交的json和文件?

谢谢


问题答案:

我尝试了多种方法来提交文件数据和元数据,这是我发现的最佳方法:

不要使用MultipartFormDataContent,仅将StreamContent用于文件数据。这样,您就可以流式传输文件上传,因此您不会在服务器上占用过多的RAM。MultipartFormDataContent要求您将整个请求加载到内存中,然后将文件保存到某处的本地存储中。通过流传输,还具有将流复制到其他位置(例如Azure存储容器)的好处。

这解决了二进制数据以及元数据的问题。为此,请使用自定义标头并将您的JSON序列化为该标头。您的控制器可以读取自定义标头并将其反序列化为元数据dto,这是大量数据。如果需要更多空间,则可以执行两个单独的请求,一个请求发布最低需求,然后执行PATCH更新需要比头文件容纳更多的任何属性。

样例代码:

public class RegulationFilesController : BaseApiController
{
    public async Task<IHttpActionResult> Post()
    {
        var isMultipart = this.Request.Content.IsMimeMultipartContent();

        if (isMultipart)
        {
            return this.BadRequest("Only binary uploads are accepted.");
        }

        var headerDto = this.GetJsonDataHeader<RegulationFileDto>();
        if(headerDto == null)
        {
            return this.BadRequest("Missing X-JsonData header.");
        }

        using (var stream = await this.Request.Content.ReadAsStreamAsync())
        {
            if (stream == null || stream.Length == 0)
            {
                return this.BadRequest("Invalid binary data.");
            }

            //save stream to disk or copy to another stream

            var model = new RegulationFile(headerDto);

            //save your model to the database

            var dto = new RegulationFileDto(model);

            var uri = new Uri("NEW URI HERE");

            return this.Created(uri, dto);
        }
    }

    private T GetJsonDataHeader<T>()
    {
        IEnumerable<string> headerCollection;

        if (!this.Request.Headers.TryGetValues("X-JsonData", out headerCollection))
        {
            return default(T);
        }

        var headerItems = headerCollection.ToList();

        if (headerItems.Count() != 1)
        {
            return default(T);
        }

        var meta = headerItems.FirstOrDefault();

        return !string.IsNullOrWhiteSpace(meta) ? JsonConvert.DeserializeObject<T>(meta) : default(T);
    }
}


 类似资料:
  • 本文向大家介绍jQuery向webApi提交post json数据,包括了jQuery向webApi提交post json数据的使用技巧和注意事项,需要的朋友参考一下 在页面想webApi post json数据的时候,发现webapi不能直接以json的方式接受数据(注:我是没有发现一个很好的方式来post json数据的);但是可以以数据结构的方式传递; 如下: 像这样的代码是没有问题的;得到

  • 问题内容: 我需要从多个JSON文件中加载数据,每个文件中都有多个记录到Postgres表中。我正在使用以下代码,但无法正常工作(在Windows上使用pgAdmin III) SAMPLE.JSON文件的内容是这样的(从许多这样的记录中得到两个记录): 问题答案: 试试这个:

  • 问题内容: 我使用POST通过AJAX将数据提交到php文件。仅提交字符串就可以很好地工作,但是现在我想使用JSON提交JS对象并在PHP端对其进行解码。 在控制台中,我可以看到我的数据已正确提交,但在PHP端,json_decode返回NULL。 我尝试了以下方法: PHP: 和: PHP: 警报只是检查一切还好… 是的,通常的字符串被正确地回显了:-) 问题答案: 您在第一个代码中出错的地方是

  • 我必须使用ajax调用向php文件提交两个值。php文件将使用$_POST[]函数处理数据。问题是我的ajax代码没有正确发送数据,所以我在console.log(result)函数中没有得到任何结果。我该如何解决这个问题?知道吗? Jquery: .PHP:

  • 问题内容: 因此,我需要通过php查询数据库,然后将查询转换为.json文件以使用Google图表。 我如何通过PHP将mysql查询转换为.json文件,如下所示: PS:此示例引自Google 问题答案: 您可以使用功能。 从数据库获取数据并将其分配给数组 然后使用。这将产生json结果。点击这里 使用功能将json结果保存到您的.json文件 以下是示例代码,

  • 问题内容: 我一直在尝试仅从JSON文件中提取某些数据。我设法将JSON解码并将所需的数据放入python dict中。当我打印出字典时,它会显示所有所需的数据,但是当我尝试将字典写入新文件时,只会写入最后一个对象。我不明白的一件事也是为什么当我打印字典时会得到多个字典对象而不是我期望的1。 我的代码: 我的json.json文件: 打印my_dict输出: 在文件test.json中输出: 我也