ASP.NET的WCF流式处理问题

本文关键字:处理问题 WCF NET ASP | 更新日期: 2023-09-27 18:01:11

我有一个承载在ASP.NET应用程序中的WCF服务,正在尝试使用流模式从另一个客户端ASP.NET应用程序上载文件。我不断得到以下错误:

远程服务器返回意外响应:(400(错误要求

我上网寻求帮助,但无济于事。

主机配置:

    <bindings>
      <basicHttpBinding>
        <binding name="FileTransferServicesBinding"
          transferMode="Streamed"
          messageEncoding="Mtom"
          sendTimeout="01:05:00"
          maxReceivedMessageSize="10067108864">
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="FileTransferServiceBehavior" name="WebServiceHost.TransferService">
        <clear />
        <endpoint address="" binding="basicHttpBinding"
          bindingConfiguration="FileTransferServicesBinding" contract="WebServiceHost.ITransferService">
          <identity>
            <dns value="localhost"/>
            <certificateReference storeName="My" storeLocation="LocalMachine"
                x509FindType="FindBySubjectDistinguishedName" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange">
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:11291/TransferService.svc" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="FileTransferServiceBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

合同代码:

[ServiceContract]
public interface ITransferService
{
    [OperationContract]
    RemoteFileInfo DownloadFile(DownloadRequest request);
    [OperationContract]
    void UploadFile(RemoteFileInfo request);
    [OperationContract]
    string TestMethod();
}
[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;
        }
    }
}

客户端配置:

<bindings>
  <basicHttpBinding>
    <binding name="FileTransferServicesBinding" sendTimeout="01:05:00"
        maxReceivedMessageSize="10067108864" messageEncoding="Mtom"
        transferMode="Streamed" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://localhost:11291/TransferService.svc/"
      binding="basicHttpBinding" bindingConfiguration="FileTransferServicesBinding"
      contract="TransferServiceReference.ITransferService" name="FileTransferService"
      kind="">
    <identity>
      <dns value="localhost" />
      <certificateReference storeName="My" storeLocation="LocalMachine"
          x509FindType="FindBySubjectDistinguishedName" />
    </identity>
  </endpoint>
</client>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

客户代码:

ITransferService clientUpload = new TransferServiceClient();
string datetime = clientUpload.TestMethod();
var uploadRequestInfo = new RemoteFileInfo();
uploadRequestInfo.FileName = FileUpload1.FileName;
uploadRequestInfo.Length = FileUpload1.PostedFile.ContentLength;
uploadRequestInfo.FileByteStream = FileUpload1.PostedFile.InputStream;
clientUpload.UploadFile(uploadRequestInfo);

对clientUpload.TestMethod((和clientUpload.UploadFile(uploadRequestInfo(的调用都失败。在缓冲模式下,会调用clientUpload:TestMethod.((,因此问题在于流模式下的配置。

如果能在这件事上找到任何帮助,我将不胜感激。谢谢

ASP.NET的WCF流式处理问题

我也遇到了同样的问题,我找到了本文的解释来解决您的错误。http://www.c-sharpcorner.com/uploadfile/BruceZhang/stream-operation-in-wcf/.

希望得到帮助!

问题在您的数据合约-public System.IO.Stream FileByteStream;中。从数据合约中删除此成员,并在操作合约中使用stream-例如:

[OperationContract(OneWay=true)]
void UploadFile(RemoteFileInfo request, System.IO.Stream fileData);

引用自大型数据和流媒体(MSDN(:

你不应该使用内部的System.IO.Stream派生类型数据合同。流数据应该使用流媒体进行通信模型,如下所述"流式数据"部分。

来自同一链接的"流数据"部分对此进行了详细解释。

问题在您的数据合同public System.IO.Stream FileByteStream;中。从数据合约中删除此成员,并在操作合约中使用stream-例如:

[OperationContract(OneWay=true)]
void UploadFile(RemoteFileInfo request, System.IO.Stream fileData);

引用自大型数据和流媒体(MSDN(:

你不应该使用内部的System.IO.Stream派生类型数据合同。流数据应该使用流媒体进行通信模型,如下所述"流式数据"部分。

来自同一链接的"流数据"部分对此进行了详细解释。

编辑:抱歉——我忽略了限制。有两种方法可以解决这个问题——使用MessageContract或对单个事务使用多个操作。使用多种操作的示例将是

[OperationContract]
Token UploadFile(System.IO.Stream fileData);
[OperationContract]
void ProvideFileInfo(Token token,  RemoteFileInfo request);

首先将数据上传到服务器,服务器将发布一个令牌(例如guid(,使用该令牌更新其他信息。

更可取的方法是使用MessageContract,您已经尝试过了。故障排除的几个建议:

  1. 如果您在IIS中托管它,请检查web.config中的maxRequestLength。尝试上载小文件
  2. 与其直接使用PostedFile的流,不如将其存储到磁盘并通过它使用流。在上传过程中,作为http请求流的推理可能会被清除
  3. 使用诸如fiddler之类的工具,看到通过电线发送到服务的消息,这可能会提供线索