程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了从HttpClient提交文件和Json数据到webapi大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决从httpClient提交文件和Json数据到webapi?

开发过程中遇到从httpClient提交文件和Json数据到webapi的问题如何解决?下面主要结合日常开发的经验,给出你关于从httpClient提交文件和Json数据到webapi的解决方法建议,希望对你解决从httpClient提交文件和Json数据到webapi有所启发或帮助;

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

不要使用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);
    }
}

解决方法

我想将文件和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和文件?

谢谢

大佬总结

以上是大佬教程为你收集整理的从HttpClient提交文件和Json数据到webapi全部内容,希望文章能够帮你解决从HttpClient提交文件和Json数据到webapi所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。