Я пытался создать службу загрузки файлов WCF и получаю следующую ошибку
в моем веб-приложении:
Введите 'System.Web.HttpInputStream'
не может быть сериализовано. Рассмотрим маркировку
это с DataContractAttribute
атрибут, и маркировка всех его
члены, которые вы хотите сериализовать с
Атрибут DataMemberAttribute. Увидеть
Microsoft .NET Framework
документация для других поддерживаемых
типы.
На основании этой ошибки я попытался повторно пометить мой FileTransfer
класс с 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'
не может быть обработано в приемнике,
из-за несоответствия AddressFilter в
EndpointDispatcher. Проверь это
отправитель и получатель
Конечная точкаАдреса согласны.
Что было бы полезно для меня, но я также нашел ту же ошибку для:
http://localhost:1242/WebProj/auth.svc/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>
Вот код в моем веб-приложении, который вызывает метод загрузки:
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
Спасибо за вашу помощь.