C# 使用HttpClient发布到Web API时收到空值
我试图向服务器发送一个对象,但我意识到,如果我的对象大于大约250 Kb,服务器接收到的对象将为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)
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 2015maxAllowedContentLength是一个32位整数,所以最大值应该是2147483647而不是2147483648maxAllowedContentLength是一个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元素下有自己的文件大小限制。
因此,除了setmaxAllowedContentLength
之外,我还需要setmaxRequestLength
<system.web>
<httpRuntime maxRequestLength="102400" targetFramework="4.6.2" />
</system.web>
及
最后,我终于解决了这个问题 ASP.NET运行时在web.config的httpRuntime元素下有自己的文件大小限制。 因此,除了set
maxAllowedContentLength
之外,我还需要setmaxRequestLength
<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>