简体   繁体   English

使用HttpClient发布到Web API中收到空值

[英]received null value in Posting to a Web API using HttpClient

I try to send an object to the server, but I realized that if my object larger than about 250 Kb server receives the object to be null . 我尝试将对象发送到服务器,但是我意识到,如果我的对象大于约250 Kb,则服务器接收到该对象为null

my Post action in asp web api 我在asp web api发布操作

// POST: api/ImagesModels
    [ResponseType(typeof(ImagesModel))]
    public IHttpActionResult PostImagesModel(ImagesModel imagesModel)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        db.ImagesModels.Add(imagesModel);
        db.SaveChanges();

        return CreatedAtRoute("DefaultApi", new { id = imagesModel.ID }, imagesModel);
    }

and my upload method in UWP 和我在UWP上传方法

private async void Upload_image(object sender, RoutedEventArgs e)
    {
        ImagesModel model = new ImagesModel();
        model.CategoryId = Convert.ToInt32(catgoryIdtxb.Text);
        model.IsNew = true;
        model.IsPayed = IsPayedchbx.IsChecked.Value;
        model.Name = ImageNameTxb.Text;
        model.PixelHeight = _imagePicWB.PixelHeight;
        model.PixelWidth = _imagePicWB.PixelWidth;
        model.ThumbnailPixelHeight = _imageThumWB.PixelHeight;
        model.ThumbnailPixelWidth = _imageThumWB.PixelWidth;
        model.Date = ImadeDate.Date.Date;
        using (Stream stream = _imagePicWB.PixelBuffer.AsStream())
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                stream.CopyTo(memoryStream);
                model.Picture = memoryStream.ToArray();
            }
        }
        using (Stream stream = _imageThumWB.PixelBuffer.AsStream())
        {
            using (MemoryStream memoryStream = new MemoryStream())
            {
                stream.CopyTo(memoryStream);
                model.Thumbnail = memoryStream.ToArray();
            }
        }
        httpClient = new HttpClient();
        httpClient.BaseAddress = new Uri("http://localhost:33134/");
        httpClient.DefaultRequestHeaders.Accept.Clear();
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/bson"));
        MediaTypeFormatter bsonFormatter = new BsonMediaTypeFormatter();
        HttpResponseMessage response = await httpClient.PostAsync("api/ImagesModels", model, bsonFormatter);
        response.EnsureSuccessStatusCode();
    }

And i tried to increase the limit of maxAllowedContentLength in web.config 我试图在web.config增加maxAllowedContentLength的限制

<system.webServer>
<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="2147483648" />
  </requestFiltering>
</security>
</system.webServer>

note: i use visual studio 2015 注意:我使用visual studio 2015

maxAllowedContentLength是一个32位整数,因此最大值应为2,147,483,647,而不是2,147,483,648

private async void Upload_image(object sender, RoutedEventArgs e)
{
    ImagesModel model = new ImagesModel();
    model.CategoryId = Convert.ToInt32(catgoryIdtxb.Text);
    model.IsNew = true;
    model.IsPayed = IsPayedchbx.IsChecked.Value;
    model.Name = ImageNameTxb.Text;
    model.PixelHeight = _imagePicWB.PixelHeight;
    model.PixelWidth = _imagePicWB.PixelWidth;
    model.ThumbnailPixelHeight = _imageThumWB.PixelHeight;
    model.ThumbnailPixelWidth = _imageThumWB.PixelWidth;
    model.Date = ImadeDate.Date.Date;
    using (Stream stream = _imagePicWB.PixelBuffer.AsStream())
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            stream.CopyTo(memoryStream);
            model.Picture = memoryStream.ToArray();
        }
    }
    using (Stream stream = _imageThumWB.PixelBuffer.AsStream())
    {
        using (MemoryStream memoryStream = new MemoryStream())
        {
            stream.CopyTo(memoryStream);
            model.Thumbnail = memoryStream.ToArray();
        }
    }
    httpClient = new HttpClient();
    httpClient.BaseAddress = new Uri("http://localhost:33134/");
    httpClient.DefaultRequestHeaders.Accept.Clear();
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/bson"));
    MediaTypeFormatter bsonFormatter = new BsonMediaTypeFormatter();
    HttpResponseMessage responceMessage = client.PostAsync("ApiUrl", new StringContent(
    new JavaScriptSerializer().Serialize(model), Encoding.UTF8, "application/json")).Result;
    response.EnsureSuccessStatusCode();
}

Just change 1 line in You code, which is HttpResponseMessage responce 只需在您的代码中更改1行,即HttpResponseMessage response

Change your web API method in order to read the file and the other image properties manually. 更改您的Web API方法,以便手动读取文件和其他图像属性。 You can check this link that explains how: 您可以检查此链接,该链接说明了如何:

https://www.asp.net/web-api/overview/advanced/sending-html-form-data-part-2 https://www.asp.net/web-api/overview/advanced/sending-html-form-data-part-2

I am not sure if you kept the image model as a parameter it will be bind or not but you can try 我不确定是否将图像模型作为参数保留或不绑定,但是可以尝试

Code: 码:

public Task<HttpResponseMessage> PostImagesModel()
    {
        // Check if the request contains multipart/form-data.
        if (!Request.Content.IsMimeMultipartContent())
        {
            throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
        }


        var provider = new MultipartFormDataStreamProvider(root);

        // Read the form data and return an async task.
        var task = Request.Content.ReadAsMultipartAsync(provider).
            ContinueWith<HttpResponseMessage>(t =>
            {
                if (t.IsFaulted || t.IsCanceled)
                {
                    Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception);
                }

                // This illustrates how to get the file names data and you can copy it to your image model.
                foreach (MultipartFileData file in provider.FileData)
                {
                    Trace.WriteLine(file.Headers.ContentDisposition.FileName);
                    Trace.WriteLine("Server file path: " + file.LocalFileName);
                }

                //here you can set the other properties of the image
                foreach (var key in provider.FormData.AllKeys)
                {
                    foreach (var val in provider.FormData.GetValues(key))
                    {
                        Trace.WriteLine(string.Format("{0}: {1}", key, val));
                    }
                }



                return Request.CreateResponse(HttpStatusCode.OK);
            });

        return task;
    }

Finally, I was able to solve this problem 最后,我能够解决这个问题

ASP.NET runtime has its own file size limit located under the httpRuntime element of the web.config. ASP.NET运行时在web.config的httpRuntime元素下有其自己的文件大小限制。 So I addition to set maxAllowedContentLength i need set maxRequestLength . 所以我除了设置maxAllowedContentLength我还需要设置maxRequestLength

<system.web>
    <httpRuntime maxRequestLength="102400" targetFramework="4.6.2" />
</system.web>

and

<system.webServer>
  <security>
      <requestFiltering>
           <!-- limit post size to 10mb, query string to 256 chars, url to 1024 chars -->
           <requestLimits maxQueryString="256" maxUrl="1024" maxAllowedContentLength="104857600" />
       </requestFiltering>
    </security>
 </system.webServer>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM