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