Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
148 views
in Technique[技术] by (71.8m points)

c# - Maximum http request size for asp web.api with json

I have web api project.

I need to post there json data with file as encoded base64 string (up to 200 mb).

If i send data up to about 10 mb, then next method normally get properly filled model ImportMultipleFileModel.

[HttpPost]
    public async Task<HttpResponseMessage> ImportMultipleFiles(ImportMultipleFileModel importMultipleFileModel)
    { 
        var response = ImportFiles(importFileModel);
        return response;
    }

If i send more, then model is null.

Why?

So i change method signature to:

    [HttpPost]
        public async Task<HttpResponseMessage> ImportMultipleFiles()
        {
            ImportMultipleFileModel importMultipleFileModel = null;
            var requestData = await Request.Content.ReadAsStringAsync();
            try
            {
                JsonConvert.
                importMultipleFileModel = JsonConvert.DeserializeObject<ImportMultipleFileModel>(requestData);
            }catch(Exception e)
            { }
}

And for encoded 30 mb file i normally get requestData as json string. For 60 mb i get empty string. Why?

Next i change method to

    [HttpPost]
        public async Task<HttpResponseMessage> ImportMultipleFiles()
        {
            ImportMultipleFileModel importMultipleFileModel = null;
            var requestData = Request.Content.ReadAsStringAsync().Result;
            try
            {
                importMultipleFileModel = JsonConvert.DeserializeObject<ImportMultipleFileModel>(requestData);
            }catch(Exception e)
            { }
}

And deserialization failed because of OutOfMemoryException.

Why?

UPD: maxRequestLength, maxAllowedContentLength set to 2147483647

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Try setting the maxRequestLength.

<httpRuntime targetFramework="4.5" maxRequestLength="65536" />

Or maxAllowedContentLength (I always get confused which one's which).

<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="52428800" />
  </requestFiltering>
</security>

Also, I would reconsider posting data this way. Read this article form MSDN, it's mainly for WCF, but I think the content is mostly valid.

The strategy to deal with large payloads is streaming.

Side note for your last example; you should not (or perhaps rarely) use .Result when you can use await. Stephen Cleary wrote a good answer on that here.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...