在使用HTTPClient发布到Web API时,已收到NULL值



我尝试将对象发送到服务器,但是我意识到,如果我的对象大于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

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

只需更改代码中的1行,即httpresponsemessage responce

更改您的Web API方法,以手动读取文件和其他映像属性。您可以检查此链接,该链接说明了:

https://www.asp.net/web-api/overview/advanced/sending-html-form-data-part-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;
    }

最后,我能够解决此问题

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>

最新更新