WCF:无法访问已关闭的流

4
我正在尝试在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);

你解决过这个问题吗?我目前也遇到了类似的问题。 - Jaans
@Jaans 是的,我做了。以下是解决我的问题的解决方案。 - Sheraz
1个回答

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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接