File upload 从Asp.net客户端将大文件上载到JBoss问题

File upload 从Asp.net客户端将大文件上载到JBoss问题,file-upload,jboss,httpwebrequest,large-file-upload,File Upload,Jboss,Httpwebrequest,Large File Upload,总之,我有一个JBoss应用程序,它使用apache common fileupload组件,我测试过它可以从asp.net客户端上传大文件,该客户端在post方法中使用HttpWebRequest。但在多次成功上传之后,它失败了,JBoss控制台出现以下异常。请帮我查一下,谢谢 org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request

总之,我有一个JBoss应用程序,它使用apache common fileupload组件,我测试过它可以从asp.net客户端上传大文件,该客户端在post方法中使用HttpWebRequest。但在多次成功上传之后,它失败了,JBoss控制台出现以下异常。请帮我查一下,谢谢

org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Stream ended unexpectedly
      at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:359)
      at com.accela.deploy.servlet.RequestHandler.getUploadFileFromRequest(RequestHandler.java:86)
      at com.accela.deploy.servlet.DeployServlet.doPost(DeployServlet.java:122)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at com.accela.commom.filter.AuthFilter.doFilter(AuthFilter.java:99)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
      at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
      at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
      at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
      at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
      at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:615)
      at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
      at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:877)
      at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:594)
      at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1733)
      at java.lang.Thread.run(Thread.java:722)
下面是server.xml内容。请检查一下

<!--APR library loader. Documentation at /docs/apr.html -->
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
<Listener className="org.apache.catalina.core.JasperListener" />


<Service name="jboss.web">

    
    <!--  A HTTP/1.1 Connector (Http11Protocol Http11NioProtocol Http11AprProtocol)-->
    <Connector protocol="org.apache.coyote.http11.Http11AprProtocol"
        address="${jboss.bind.address}" port="${av.http.port}"
        scheme="http" secure="false"
        URIEncoding="UTF-8"
        redirectPort="${av.https.port}"
        maxHttpHeaderSize="8192"
        maxThreads="${av.http.maxThreads:500}" 
        acceptCount="${av.http.acceptCount:200}" 
        enableLookups="false"
        disableUploadTimeout="true"
        /> 


    <!--  Java SSL Coyote HTTP/1.1 Connector using Apache Portable Runtime (APR) -->
    <Connector protocol="org.apache.coyote.http11.Http11AprProtocol"
        address="${jboss.bind.address}" port="${av.https.port}"
        scheme="https" secure="true"
        URIEncoding="UTF-8"
        maxHttpHeaderSize="8192"
        maxThreads="${av.https.maxThreads:500}"
        acceptCount="${av.https.acceptCount:200}"
        enableLookups="false"
        disableUploadTimeout="true"
        SSLEnabled="true"
        SSLVerifyClient="none"
        SSLProtocol="all"
        SSLCipherSuite="!aNULL:!ADH:!eNULL:!LOW:!EXP:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:ALL"
        SSLCertificateFile="${jboss.server.home.dir}/conf/certs/${av.host}.crt" 
        SSLCertificateKeyFile="${jboss.server.home.dir}/conf/certs/${av.host}.key"
    /> 




    <Engine name="jboss.web" defaultHost="localhost">

        <Realm className="org.jboss.web.tomcat.security.JBossSecurityMgrRealm"
        certificatePrincipal="org.jboss.security.auth.certs.SubjectDNMapping"
        allRolesMode="authOnly"
        />

        <Host name="localhost"
            autoDeploy="false" deployOnStartup="false" deployXML="false"
            configClass="org.jboss.web.tomcat.security.config.JBossContextConfig">
        
            <Valve className="org.apache.catalina.valves.AccessLogValve"
                prefix="av.web.${jboss.bind.address}.access." 
                suffix=".log" 
                pattern="%a %t %T &quot;%r&quot; %s %b %u %S %p" 
                directory="${jboss.server.log.dir}" 
                resolveHosts="false" />

                <Valve className="org.jboss.web.tomcat.service.sso.ClusteredSingleSignOn" />
            -->
         
            <!-- Check for unclosed connections and transaction terminated checks
                in servlets/jsps.

                Important: The dependency on the CachedConnectionManager
                in META-INF/jboss-service.xml must be uncommented, too
            -->
            <Valve className="org.jboss.web.tomcat.service.jca.CachedConnectionValve"
            cachedConnectionManagerObjectName="jboss.jca:service=CachedConnectionManager"
            transactionManagerObjectName="jboss:service=TransactionManager" />          
        </Host>
    </Engine>

</Service>
我的想法: 我认为
流意外结束的根本原因是
异常是我发布到服务器的流的长度不完全等于我在HttpWebRequest.ContentLength中指定的长度

我的问题:

1.如果HttpWebRequest.ContentLength的长度大于或小于我发送到服务器的实际大小,该怎么办

2.如果我在失败的post后继续执行
SendSingleChunk
?服务器似乎将这两个请求流识别为同一个请求流


错误消息显示:

.. Stream ended unexpectedly
这很可能是因为在多次成功上载后,
asp.net
客户端应用程序意外关闭了套接字,或者可能存在连接问题。有关此错误的可能原因的完整讨论,请参阅下面的线程


总之,对于上传大文件问题,以下是一些我们应该注意的提示。 无论您使用什么Web服务器,实际上在将文件从某个客户端上载到它的过程中,接收数据后它要做的第一件事就是将数据持久化到某个临时目录。因此,首先要确保服务器中的应用程序有足够的权限将数据写入磁盘。 其次如果我们像我一样用底层html协议上传文件。 我们应该仔细检查协议,确保每个步骤都遵循协议。这是它的基本原理。 我想说的最后一件事是,如果出于某种目的使用asp.net作为web客户端,则必须仔细检查
HttpWebRequest
的这些属性的用途。谢谢

request.KeepAlive = false;
request.Timeout = 300 * 60 * 1000; //300 mins;
request.ContentLength = lContentLen;
request.AllowAutoRedirect = false;

你是如何上传文件的?什么浏览器和版本?看一个相关的线程。好问题,我正在使用asp.net HttpWebRequest post方法模拟以html形式发布文件。><代码>字符串边界=“------------------------------------”+DateTime.Now.Ticks.ToString(“x”);string scocontenttype=“多部分/表单数据;boundary=“+boundary我不发布.net代码的原因,因为我认为它对于解决问题不重要。但是如果你还想知道什么,请告诉我。谢谢。什么类型的申请?你能发布代码吗?你消除了传输/网络层问题的可能性了吗?我建议在上传过程中进行连续ping。ping中的任何中断或高数据包返回时间都表明存在网络问题。为什么套接字意外关闭?如果存在连接问题,如何识别?可能是
asn.net
客户端问题,也可能是其他问题。你和其他客户测试过吗?e、 浏览器?
request.KeepAlive = false;
request.Timeout = 300 * 60 * 1000; //300 mins;
request.ContentLength = lContentLen;
request.AllowAutoRedirect = false;