2009-10-27 53 views
1

我一直在试图设计一个WCF文件上传服务,并正在以下错误 在我的web应用程序:类型“System.Web.HttpInputStream”无法序列

类型“System.Web.HttpInputStream ' 无法序列化。请考虑使用DataContractAttribute 属性标记 ,并使用 DataMemberAttribute属性标记要与其序列化的所有成员 成员。有关其他支持的 类型,请参阅 Microsoft .NET Framework 文档。

基于这个错误,我试图重新标记我的文件传输 类DataContractAttribute和DataMemberAttribute 但没有做任何事情:

[DataContractAttribute(Namespace = "FileTransfer")] 
public class FileTransfer 
{ 
    [DataMemberAttribute] 
    public string GetUploadStatus; 
    [DataMemberAttribute] 
    public Tuple<string, int> DoUpload; 
    [DataMemberAttribute] 
    public int UploadFile; 
    [DataMemberAttribute] 
    public FileTransferInfo FileInfo; 
    [DataMemberAttribute] 
    public Stream FileByteStream; 
} 

我试图访问我的服务跟踪日志与服务跟踪查看器到 看看我是否可以得到关于这个错误的更多细节。我发现了一些错误 以下消息的:

该消息与要 “http://localhost:1242/WebProj/filetransfer.svc/mex/mex” 不能在接收器进行处理, 由于在 所述EndpointDispatcher一个AddressFilter失配。检查发送方和接收方的 EndpointAddresses是否同意。

这将是有益的给我,但我也发现了同样的错误:

http://localhost:1242/WebProj/auth.svc/mex/mex

在相同的跟踪

,我能不认证就好了任何错误都让我想知道这个错误是不是我应该担心的事情(如果任何机构对我的终端上为什么有mex/mex这个建议,那会很棒)。

那么,为什么'System.Web.HttpInputStream'不能被序列化呢?我在下面提供了我的代码的其他重要方面。也许有人可以看到我错过的东西?

[DataContract(Namespace = "FileTransfer")] 
public class FileTransferInfo 
{ 
    private string _guid; 
    private int _flag; 
    private long _fileSize; 
    private string _fileName; 
    private DateTime _lastUpdate; 
    private FileTypeEnum _fileType; 

    //REMOVED GETTERS AND SETTERS FOR SPACE 

} 

[ServiceContract(Namespace = "FileTransfer")] 
public interface IFileTransferService 
{ 
    [OperationContract(Name = "DoUpload")] 
    Tuple<string, int> DoUpload(List<FileTransferInfo> request); 

    [OperationContract(Action="UploadFile", Name="UploadFile")] 
    int UploadFile(FileTransfer request); 

} 

这是我的UploadFile方法,它返回错误。

int IFileTransferService.UploadFile(FileTransfer request) 
{ 

    string uploadFolder = @"C:\TempMultiFileUploads\"; 
    int errCode = default(int); 
    // parameters validation omitted for clarity 
    try 
    { 
     string filename = request.FileInfo.FileName; 
     string filePath = Path.Combine(uploadFolder, filename); 

     using (FileStream outfile = new FileStream(filePath, FileMode.Create)) 
     { 
      const int bufferSize = 65536; // 64K 

      Byte[] buffer = new Byte[bufferSize]; 
      int bytesRead = request.FileByteStream.Read(buffer, 0, bufferSize); 

      while (bytesRead > 0) 
      { 
       outfile.Write(buffer, 0, bytesRead); 
       bytesRead = request.FileByteStream.Read(buffer, 0, bufferSize); 
      } 
     } 
    } 
    catch (IOException e) 
    { 
     //System.IOException 
     errCode = 800; 
    } 

    return errCode; 

} 
    And, below is the endpoint, binding, and bahavior of my FileTransferService: 

<endpoint name="MyFileTransferEP" 
      address="" 
      binding="basicHttpBinding" 
      behaviorConfiguration="BasicHttpEPBehavior" 
      bindingConfiguration="httpLargeDataStream" 
      contract="FileTransfer.IFileTransferService" /> 

<binding name="httpLargeDataStream" 
       closeTimeout="00:01:00" 
       openTimeout="00:01:00" 
       receiveTimeout="00:10:00" 
       sendTimeout="00:01:00" 
       maxBufferSize="65536" 
       maxReceivedMessageSize="2147483647" 
       messageEncoding="Mtom" 
       transferMode="StreamedRequest">   

<behavior name="BasicHttpEPBehavior"> 
    <dataContractSerializer maxItemsInObjectGraph="2147483646" /> 
</behavior> 

这里是我的web应用程序的代码调用上传方法:

FileTransferServiceClient upload = new FileTransferServiceClient(); 
HttpPostedFile m_objFile = default(HttpPostedFile); 
FileTransfer transmit = new FileTransfer(); 

transmit.FileByteStream = m_objFile.InputStream; 
transmit.FileInfo = new FileTransferInfo(); 
transmit.FileInfo.Guid = Guid.NewGuid().ToString(); 
transmit.FileInfo.Flag = default(int); 
transmit.FileInfo.FileSize = m_objFile.ContentLength; 
transmit.FileInfo.FileName = m_objFile.FileName; 
transmit.FileInfo.LastUpdate = DateTime.Now; 

int retParam = upload.UploadFile(transmit); // THROWS ERROR HERE 

感谢您的帮助。

+0

可能重复http://stackoverflow.com/questions/1580639/type-system-web-httprequest-cannot-be-serialized – 2012-06-29 19:10:54

回答

2

您无法与Stream成员定义数据合同。您可以将Stream作为单个参数接受或返回,也可以定义具有Stream类型的单个MessageBodyMember但具有多个MessageHeaders的消息协定。有关WCF中的大数据流的更多信息,请参阅this section of MSDN

+0

给它一个阅读。很有帮助。感谢德鲁的反馈。 – 2009-10-28 13:20:17

+0

我有一个相关的后续错误,如果你不介意:
错误类型“WebAPI.FileTransfer.FileUploadMessage”两个“C存在:\ WINDOWS \ Microsoft.NET \框架\ V2.0.50727 \ Temporary ASP.NET Files \ web-06.08.09 \ 8a531a06 \ 51fdee26 \ assembly \ dl3 \ ae1f49ea \ c2031a0d_1758ca01 \ WebAPILibrary.DLL'and'c:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ web-06.08.09 \ 8a531a06 \ 51fdee26 \ App_WebReferences.7bmoffs1.dll'\t
我很确定我不重复程序集并清除了ASP.NET TEMP。我也删除了我的服务并重新添加了它。任何想法,我可能会在这里做什么? – 2009-10-28 21:57:03

+0

您有一个Web引用*和*,您似乎引用了一个具有相同名称空间/类型名称的预编译数据约定程序集(WebAPILibrary)。如果您要引用外部程序集,请删除您的Web引用。 – 2009-10-28 22:02:19

相关问题