How do I upload large (> 25MB) files to a web serv

2019-01-16 07:19发布

I have a web service that takes a byte[] and saves it.

This works fine for "small" files, but once I hit a certain size the web service fails and returns "The request failed with HTTP status 404: Not Found."

From what I've seen this appears to be an IIS setting that limits the size of a file that can be posted (to prevent Denial of Service attacks). I've tried to increase that setting, but I am having trouble determining what setting and where/how one would set it. I am using IIS7 and the webservice is done in .net (asmx).

In the web.config of the web service I have added the following (which seemed to increase the size of file that can be accepted, but not all the way to this setting size)

  <system.web>
     <httpRuntime executionTimeout="999999" maxRequestLength="2097151" />
     ...
  </system.web>

Any suggestions on where (and how) to increase the size of file that the web service would be greatly appreciated.

8条回答
何必那么认真
2楼-- · 2019-01-16 07:53

Just to add information to people googling this web.config:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI

<location path="Copy.asmx"> <!-- Name of you asmx -->
    <system.webServer>
      <security>
        <requestFiltering>
          <requestLimits maxAllowedContentLength="104857600"/> <!-- 100 megs -->
        </requestFiltering>
      </security>
    </system.webServer>
  </location>

This solved our problem after troubleshooting this issue for quite som time.

查看更多
成全新的幸福
3楼-- · 2019-01-16 07:57

maxRequestLength is in KB, not bytes. This should give you a 30 MB limit within a 4-minute timeout window.

<httpRuntime executionTimeout="240" maxRequestLength="30000" />

Having numbers that are too high may be actually preventing your values from being applied. I think I ran into this a few years ago when I thought it was a byte limit (vague memory).

查看更多
ら.Afraid
4楼-- · 2019-01-16 07:58

If you're set on using Web Services to move around files I would at least consider using WS-Attachment / DIME attachments. The primary problem with sending byte[]'s over web services is that they get put in the SOAP body which is gets encoded as a base 64 string. Encoding files like this grows the size of the file by as much as two thirds in the soap body (ie. a 6 MB file becomes a 9 MB file over the wire).

It's likely that your 25 MB upload is turning into HUGE soap envelopes.

I'd strongly suggest reading this. Which might get you into DIME.

Here's an excerpt.

Microsoft's WSE Toolkit allows large attachments to be sent along with a Web service method using the DIME and WS-Attachments standards. We'll examine these standards and why they are more efficient than sending large amounts of binary data in a Web service call through other common means.

Hope that helps!

查看更多
我想做一个坏孩纸
5楼-- · 2019-01-16 07:59

this worked for me:

            <binding name="uploadFilesBasicHttpBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" receiveTimeout="00:10:10" sendTimeout="00:10:00" openTimeout="00:10:00" closeTimeout="00:10:00">
                <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
                <security mode="TransportWithMessageCredential">
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
查看更多
唯我独甜
6楼-- · 2019-01-16 08:03

If I was stuck having to use web services and needed to support very large files I would look at implementing a system that allows you to upload files in pieces.

Eg.

  • ticketId GetTicket(size)
  • UploadData(ticketId, byte[] payload) (this can be called as many times as you want)
  • FinalizeUpload(ticketId)

This would allow you to chunk up the big uploads, and not hold too much data in memory. The disadvantage is that you are still using a fairly inefficient transport mechanism.

查看更多
叛逆
7楼-- · 2019-01-16 08:10

This doesn't specifically answer you question, but what I've done in the past is use WCF to transfer file names/paths/listings, but then use an FTP library to transfer the file via FTP.

查看更多
登录 后发表回答