Тип 'System.Web.HttpInputStream' не может быть сериализован - PullRequest
1 голос
/ 27 октября 2009

Я пытался создать службу загрузки файлов 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

Спасибо за вашу помощь.

1 Ответ

2 голосов
/ 27 октября 2009

Вы не можете определить контракт данных с участником потока. Вы можете либо принять, либо вернуть Stream в качестве единственного параметра, либо определить контракт сообщения, который имеет один MessageBodyMember типа Stream, но может иметь несколько MessageHeaders. Подробнее о потоковой передаче больших данных в WCF см. в этом разделе MSDN .

.
...