WCF使用IIS6传输大文件(上传)

时间:2015-01-07 12:03:10

标签: wcf file-upload streaming

当我尝试上传文件大小超过47Kb时,它将显示以下错误

错误:远程服务器返回了意外响应:(400)错误请求。

wcf服务托管在iis 6服务器

请帮我纠正这个问题

如下所述的实际编码。

此致

Wiraj web.config编码........................................

    <?xml version="1.0"?>
<!-- 
    Note: As an alternative to hand editing this file you can use the 
    web admin tool to configure settings for your application. Use
    the Website->Asp.Net Configuration option in Visual Studio.
    A full list of settings and comments can be found in 
    machine.config.comments usually located in 
    \Windows\Microsoft.Net\Framework\v2.x\Config 
-->
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483648" />
      </requestFiltering>
    </security>
  </system.webServer>

    <appSettings/>
    <connectionStrings/>
    <system.web>
        <!-- 
            Set compilation debug="true" to insert debugging 
            symbols into the compiled page. Because this 
            affects performance, set this value to true only 
            during development.
        -->
        <compilation debug="true" targetFramework="4.0">
        </compilation>
        <!--
            The <authentication> section enables configuration 
            of the security authentication mode used by 
            ASP.NET to identify an incoming user. 
        -->
        <authentication mode="Windows"/>
        <!--
            The <customErrors> section enables configuration 
            of what to do if/when an unhandled error occurs 
            during the execution of a request. Specifically, 
            it enables developers to configure html error pages 
            to be displayed in place of a error stack trace.

        <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
            <error statusCode="403" redirect="NoAccess.htm" />
            <error statusCode="404" redirect="FileNotFound.htm" />
        </customErrors>
        -->
        <!--<httpRuntime maxRequestLength="920971500" useFullyQualifiedRedirectUrl="true"
     executionTimeout="914400" />-->
    <httpRuntime
executionTimeout="90"
maxRequestLength="9994096"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="100"
enableVersionHeader="true"
/>
        <pages controlRenderingCompatibilityVersion="4.5" clientIDMode="AutoID"/>

  </system.web>
    <!-- 
        The system.webServer section is required for running ASP.NET AJAX under Internet
        Information Services 7.0.  It is not necessary for previous version of IIS.
    -->
    <system.serviceModel>
        <bindings>
   <basicHttpBinding>
    <binding name="BasicHttpBinding_ITransferService" closeTimeout="10:01:00"
     openTimeout="10:01:00" receiveTimeout="10:10:00" sendTimeout="10:01:00"
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
     maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
     messageEncoding="Mtom" textEncoding="utf-8" transferMode="StreamedRequest"
     useDefaultWebProxy="true">
     <readerQuotas maxDepth="128" maxStringContentLength="2147483647"
      maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
     <security mode="None">
      <transport clientCredentialType="None" proxyCredentialType="None"
       realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
     </security>
    </binding>
    <binding name="BasicHttpBinding_ITransferService1" closeTimeout="10:01:00"
     openTimeout="10:01:00" receiveTimeout="10:10:00" sendTimeout="10:01:00"
     allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
     maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
     messageEncoding="Text" textEncoding="utf-8" transferMode="StreamedRequest"
     useDefaultWebProxy="true">
     <readerQuotas maxDepth="128" maxStringContentLength="2147483647"
      maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
     <security mode="None">
      <transport clientCredentialType="None" proxyCredentialType="None"
       realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
     </security>
    </binding>
   </basicHttpBinding>
  </bindings>
        <client>
   <endpoint address="http://midoc-server-bk.milnetfinity.com/test1/wcfservice.TransferService.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITransferService"
    contract="wcfservice.ITransferService" name="BasicHttpBinding_ITransferService" />
   <endpoint address="http://midoc-server-bk.milnetfinity.com/test1/wcfservice.TransferService.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITransferService1"
    contract="ITransferService.ITransferService" name="BasicHttpBinding_ITransferService1" />
  </client>
    <protocolMapping>
      <add binding="basicHttpBinding" scheme="http" bindingConfiguration="BasicHttpBinding_ITransferService"/>
    </protocolMapping>
    </system.serviceModel>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel"
              switchValue="Information, ActivityTracing"
              propagateActivity="true">
        <listeners>
          <add name="traceListener"
              type="System.Diagnostics.XmlWriterTraceListener"
              initializeData= "c:\log\Traces.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

</configuration>

app.config代码------------------------------------------- ----------

   <?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2147483648" />
      </requestFiltering>
    </security>
  </system.webServer>

  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <bindings>
      <!--<netTcpBinding>
        <binding name="netTcpBinding_ITransferService" maxReceivedMessageSize="10485760"  transferMode="Streamed" messageEncoding="Mtom"/>
      </netTcpBinding>-->

    <basicHttpBinding>
      <!--<binding name="BasicHttpBinding_ITransferService" maxReceivedMessageSize="910485760" sendTimeout="04:10:00"  messageEncoding="Mtom" transferMode="StreamedRequest" />-->
      <binding name="BasicHttpBinding_ITransferService" closeTimeout="10:01:00"
      openTimeout="10:01:00" receiveTimeout="10:10:00" sendTimeout="10:01:00"
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647"
      messageEncoding="Mtom" textEncoding="utf-8" transferMode="StreamedRequest"
      useDefaultWebProxy="true">
        <readerQuotas maxDepth="128" maxStringContentLength="2147483647"
         maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
        <security mode="None">
          <transport clientCredentialType="None" proxyCredentialType="None"
           realm="" />
          <message clientCredentialType="UserName" algorithmSuite="Default" />
        </security>
      </binding>


    </basicHttpBinding>






    </bindings>
    <!--<client >

    </client >-->
    <services>
      <!--<service name="wcfservice.Service1">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/wcfservice/Service1/"   />
          </baseAddresses>
        </host>
        --><!-- Service Endpoints --><!--
        --><!-- Unless fully qualified, address is relative to base address supplied above --><!--
        <endpoint address=""  binding="basicHttpBinding" contract="wcfservice.IService1">
          --><!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          --><!--
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        --><!-- Metadata Endpoints --><!--
        --><!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. --><!-- 
        --><!-- This endpoint does not use a secure binding and should be secured or removed before deployment --><!--
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>-->
      <service name="wcfservice.TransferService">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8732/Design_Time_Addresses/wcfservice/TransferService/"   />
          </baseAddresses>
        </host>
        <!-- Service Endpoints -->
        <!-- Unless fully qualified, address is relative to base address supplied above -->
        <endpoint address=""  binding="basicHttpBinding" contract="wcfservice.ITransferService" >
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <!-- Metadata Endpoints -->
        <!-- The Metadata Exchange endpoint is used by the service to describe itself to clients. -->
        <!-- This endpoint does not use a secure binding and should be secured or removed before deployment -->
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

转移service.cs代码----------------------------------------'< / p>

       public messageout UploadFile(RemoteFileInfo request)
        {
            messageout strerror = new messageout() ;
            strerror.message = "OK";
            try
            {
                strerror.message  = "OK1";
                FileStream targetStream = null;
                Stream sourceStream = request.FileByteStream;

                string uploadFolder = @"c:\Uploadfiles\";
                string filePath = Path.Combine(uploadFolder, request.FileName);

                using (targetStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    //read from the input stream in 6K chunks
                    //and save to output stream
                    strerror.message = "OK2";
                    const int bufferLen = 65000;
                    byte[] buffer = new byte[bufferLen];
                    int count = 0;
                    while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0)
                    {
                        targetStream.Write(buffer, 0, count);
                        strerror.message = "OK3";
                    }
                    targetStream.Close();
                    sourceStream.Close();
                }

                strerror.message = "OK4";
            }
            catch (Exception ex)
            {
                strerror.message = ex.ToString();
            }

            return strerror;
        }

    }
}

ITransferservice.cs --------------------------

  [ServiceContract]
    public interface ITransferService
    {
        [OperationContract]
        RemoteFileInfo DownloadFile(DownloadRequest request);

        [OperationContract]
        messageout UploadFile(RemoteFileInfo request);
    }
    [MessageContract]
    public class DownloadRequest
    {
        [MessageBodyMember]
        public string FileName;
    }

    [MessageContract]
    public class RemoteFileInfo : IDisposable
    {
        [MessageHeader(MustUnderstand = true)]
        public string FileName;

        [MessageHeader(MustUnderstand = true)]
        public long Length;

        [MessageBodyMember(Order = 1)]
        public System.IO.Stream FileByteStream;

        public void Dispose()
        {
            if (FileByteStream != null)
            {
                FileByteStream.Close();
                FileByteStream = null;
            }
        }


    }
    [MessageContract]
    public class messageout : IDisposable
    {
        [MessageHeader(MustUnderstand = true)]
        public string message;

        public void Dispose()
        {
            message = "";

        }

    }

0 个答案:

没有答案