Wcf 类型';System.Web.HttpInputStream';无法序列化
我一直在试图设计一个WCF文件上传服务,并得到以下错误 在我的web应用程序中: 键入“System.Web.HttpInputStream” 无法序列化。考虑标记 它使用datacontract属性 属性,并标记其所有 要使用序列化的成员 DataMemberAttribute属性。看见 Microsoft.NET框架 其他受支持项目的文档 类型 基于此错误,我已尝试重新标记我的文件传输 使用DataContractAttribute和DataMemberAttribute初始化 但这并没有起到任何作用:Wcf 类型';System.Web.HttpInputStream';无法序列化,wcf,upload,stream,serialization,Wcf,Upload,Stream,Serialization,我一直在试图设计一个WCF文件上传服务,并得到以下错误 在我的web应用程序中: 键入“System.Web.HttpInputStream” 无法序列化。考虑标记 它使用datacontract属性 属性,并标记其所有 要使用序列化的成员 DataMemberAttribute属性。看见 Microsoft.NET框架 其他受支持项目的文档 类型 基于此错误,我已尝试重新标记我的文件传输 使用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;
}
谢谢你的帮助 不能定义具有流成员的数据协定。您可以将流作为单个参数获取或返回,也可以定义一个消息协定,该协定有一个类型为Stream的MessageBodyMember,但可以有多个MessageHeader。有关WCF中大数据流的更多信息,请参阅。如果您不介意,我有一个相关的后续错误:
错误3“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\web-06.08.09\8a531a06\51fdee26\assembly\dl3\ae1f49ea\c2031a0d\U 1758ca01\WebAPIBrary.DLL”和“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\ASP.NET临时文件\web-06.08.09\8a531a06\51fdee26\App_WebReferences.7BMOFF1.dll”
我确信我没有重复程序集,并且已清除ASP.NET临时文件。我还删除了我的服务并重新添加了它。你知道我在这里做什么吗?你有一个web引用,而且你似乎引用了一个预编译的数据协定程序集(WebAPILibrary),其中有相同的命名空间/类型名。如果要引用外部程序集,请删除您的web引用。可能存在的重复项
[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);
}
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>
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