C# 使用HttpClient发布到Web API时收到空值

C# 使用HttpClient发布到Web API时收到空值,c#,asp.net,asp.net-web-api,uwp,httpclient,C#,Asp.net,Asp.net Web Api,Uwp,Httpclient,我试图向服务器发送一个对象,但我意识到,如果我的对象大于大约250 Kb,服务器接收到的对象将为null 我在asp web api中的发布操作 // POST: api/ImagesModels [ResponseType(typeof(ImagesModel))] public IHttpActionResult PostImagesModel(ImagesModel imagesModel) { if (!ModelState.IsValid)

我试图向服务器发送一个对象,但我意识到,如果我的对象大于大约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位整数,所以最大值应该是2147483647而不是2147483648

maxAllowedContentLength是一个32位整数,所以最大值应该是2147483647而不是2147483648

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行,即HttpResponseMessageResponse


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

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

我不确定您是否将图像模型作为参数,它是否会绑定,但您可以尝试

代码:

公共任务PostImagesModel()
{
//检查请求是否包含多部分/表单数据。
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var provider=新的MultipartFormDataStreamProvider(根);
//读取表单数据并返回异步任务。
var task=Request.Content.ReadAsMultipartAsync(提供程序)。
继续(t=>
{
如果(t.IsFaulted | | t.IsCanceled)
{
Request.CreateErrorResponse(HttpStatusCode.InternalServerError,t.Exception);
}
//这说明了如何获取文件名数据,并可以将其复制到图像模型中。
foreach(provider.FileData中的MultipartFileData文件)
{
Trace.WriteLine(file.Headers.ContentDisposition.FileName);
Trace.WriteLine(“服务器文件路径:“+file.LocalFileName”);
}
//您可以在此处设置图像的其他属性
foreach(provider.FormData.AllKeys中的var键)
{
foreach(provider.FormData.GetValues(键)中的var val)
{
Trace.WriteLine(string.Format(“{0}:{1}”,key,val));
}
}
返回Request.CreateResponse(HttpStatusCode.OK);
});
返回任务;
}

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

我不确定您是否将图像模型作为参数,它是否会绑定,但您可以尝试

代码:

公共任务PostImagesModel()
{
//检查请求是否包含多部分/表单数据。
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
var provider=新的MultipartFormDataStreamProvider(根);
//读取表单数据并返回异步任务。
var task=Request.Content.ReadAsMultipartAsync(提供程序)。
继续(t=>
{
如果(t.IsFaulted | | t.IsCanceled)
{
Request.CreateErrorResponse(HttpStatusCode.InternalServerError,t.Exception);
}
//这说明了如何获取文件名数据,并可以将其复制到图像模型中。
foreach(provider.FileData中的MultipartFileData文件)
{
Trace.WriteLine(file.Headers.ContentDisposition.FileName);
Trace.WriteLine(“服务器文件路径:“+file.LocalFileName”);
}
//您可以在此处设置图像的其他属性
foreach(provider.FormData.AllKeys中的var键)
{
foreach(provider.FormData.GetValues(键)中的var val)
{
Trace.WriteLine(string.Format(“{0}:{1}”,key,val));
}
}
返回Request.CreateResponse(HttpStatusCode.OK);
});
返回任务;
}

最后,我终于解决了这个问题

ASP.NET运行时在web.config的httpRuntime元素下有自己的文件大小限制。 因此,除了set
maxAllowedContentLength
之外,我还需要set
maxRequestLength

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


最后,我终于解决了这个问题

ASP.NET运行时在web.config的httpRuntime元素下有自己的文件大小限制。 因此,除了set
maxAllowedContentLength
之外,我还需要set
maxRequestLength

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



我认为问题出在其他地方,我测试了较低的数字我认为问题出在其他地方,我测试了较低的数字
stringContent
大于
bson
,所以这对我没有帮助。我的问题是,我无法上传大于约250kb的照片
stringContent
大于
bson
,因此这对我没有帮助。我的问题是我不能上传大于250KB的照片为什么我要改变我的解决方案?如果不使用
多部分MIME
问题,就无法解决问题?因为这是Microsoft建议的拥有一个接受文件的控制器的方式,为什么我要更改我的解决方案?如果不使用
多部分MIME
问题,就无法解决此问题,因为Microsoft建议使用一个接受文件的控制器
<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>