簡體   English   中英

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

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

我嘗試將對象發送到服務器,但是我意識到,如果我的對象大於約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 response

更改您的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;
    }

最后,我能夠解決這個問題

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM