WCF:无法访问已关闭的流

时间:2016-09-05 06:31:53

标签: c# wcf stream

我正在尝试在WCF中接收Stream对象但是当我收到它时,我得到一个封闭的Stream。 以下是我的代码

[OperationContract]
string ProcessPackageUsingStream(FileStream stream, string fileName, string docType, string customerKey, int documentId);

在实现中我正在使用这个流对象。

string ProcessPackageUsingStream(FileStream stream, string fileName, string docType, string customerKey, int documentId);
{
     //Stream is closed here
}

这是我的配置文件

<system.serviceModel>
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

     <bindings>          
             <basicHttpBinding>
             <binding name="TransferService"   maxReceivedMessageSize="2147483647"  maxBufferSize="2147483647" transferMode="Streamed" >
                 <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
             <security mode="None"> 
             </security> 
           </binding>          
         </basicHttpBinding>
     </bindings>
     <services>

         <service behaviorConfiguration="TransferServiceBehavior" name="TransferService">
              <endpoint  address=""
             binding="basicHttpBinding" bindingConfiguration="TransferService"
                contract ="ITransferService">
                         </endpoint>
          </service>
     </services>
     <behaviors>
         <serviceBehaviors>

             <behavior name="TransferServiceBehavior">
                 <serviceMetadata httpGetEnabled="true" />
               <dataContractSerializer maxItemsInObjectGraph="2147483647" />
                 <serviceDebug includeExceptionDetailInFaults="true" />
                 <serviceThrottling
                      maxConcurrentCalls="500"
                      maxConcurrentSessions="500"
                      maxConcurrentInstances="500"
                    />
             </behavior>
         </serviceBehaviors>
     </behaviors>
 </system.serviceModel>

在客户端,我添加了对此服务的引用并使用了以下代码

SPCServiceClient service = new SPCServiceClient();
    service.ProcessPackageUsingStream(File.OpenRead(@"D:\Dev\TestData\002160500041.pdf"), "002160500041.pdf", "Test", "VLR@2016", 1211);

1 个答案:

答案 0 :(得分:0)

我解决了这个问题。以下解决方案为我工作。 而不是直接作为参数传递流,我创建了两个类,一个用于传递参数,另一个用于获取响应,如:

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

        [MessageHeader(MustUnderstand = true)]
        public string DocType;

        [MessageHeader(MustUnderstand = true)]
        public string CustomerKey;

        [MessageHeader(MustUnderstand = true)]
        public string DocumentId;

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

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

[MessageContract]
public class RemoteResponse
{
    [MessageBodyMember(Order = 1)]
    public string Token;
}

然后我在WCF服务中更新了我的方法:

[OperationContract]
RemoteResponse ProcessPackageUsingStream(RemoteFileInfo remote);

并更新了我的app.config

<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_IPreProcessor" transferMode="Streamed" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" >
      <readerQuotas maxDepth = "2147483647"
            maxStringContentLength = "2147483647"
            maxArrayLength = "2147483647"
            maxBytesPerRead = "2147483647"
            maxNameTableCharCount = "2147483647"/>
    </binding>
  </basicHttpBinding>
</bindings>