【问题标题】:received null value in Posting to a Web API using HttpClient在使用 HttpClient 发布到 Web API 时收到空值
【发布时间】:2016-12-04 12:11:39
【问题描述】:

我尝试向服务器发送一个对象,但我意识到如果我的对象大于大约 250 Kb,服务器接收到的对象是null

我在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);
    }

还有我在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();
    }

并且我试图在web.config 中增加maxAllowedContentLength 的限制

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

注意:我使用visual studio 2015

【问题讨论】:

    标签: c# asp.net asp.net-web-api uwp httpclient


    【解决方案1】:

    maxAllowedContentLength 是一个 32 位整数,所以最大值应该是 2,147,483,647 而不是 2,147,483,648

    【讨论】:

    • 我认为问题出在其他地方,我测试了较低的数字
    【解决方案2】:
    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();
    }
    

    只需更改代码中的 1 行,即 HttpResponseMessage 响应

    【讨论】:

    • stringContent 大于bson 所以这对我没有帮助。我的问题是我无法上传大于约 250kb 的照片
    【解决方案3】:

    更改您的 Web API 方法以手动读取文件和其他图像属性。 您可以查看此链接,该链接解释了如何:

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

    我不确定你是否将图像模型作为参数保留,但你可以尝试

    代码:

    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;
        }
    

    【讨论】:

    • 我为什么要改变我的解决方案?不使用Multipart MIME问题解决不了?
    • 因为这是微软推荐的一种接受文件的控制器的方式
    【解决方案4】:

    终于解决了这个问题

    ASP.NET 运行时在 web.config 的 httpRuntime 元素下有自己的文件大小限制。 所以我除了设置maxAllowedContentLength 我还需要设置maxRequestLength

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

    <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>
    

    【讨论】:

    • 这篇特别的帖子让我免于耽误一天。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 2019-05-10
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2011-09-01
    相关资源
    最近更新 更多