我一直在试图设计一个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是否同意。
这将是有益的给我,但我也发现了同样的错误:
在相同的跟踪
,我能不认证就好了任何错误都让我想知道这个错误是不是我应该担心的事情(如果任何机构对我的终端上为什么有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
感谢您的帮助。
可能重复http://stackoverflow.com/questions/1580639/type-system-web-httprequest-cannot-be-serialized – 2012-06-29 19:10:54