Domanda

Ho provato a progettare un servizio di upload di file WCF e sto ottenendo il seguente errore nella mia applicazione web:

  

Digita "System.Web.HttpInputStream"   non può essere serializzato. Prendi in considerazione la marcatura   con DataContractAttribute   attributo e contrassegnando tutto ciò   membri che si desidera serializzare con   Attributo DataMemberAttribute. Vedere   Microsoft .NET Framework   documentazione per altri supportati   tipi.

Sulla base di questo errore, ho provato a riscrivere il mio FileTransfer classe con DataContractAttribute e DataMemberAttribute ma questo non ha fatto nulla:

[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;
}

Ho provato ad accedere al mio registro di traccia del servizio con Service Trace Viewer vedere se potrei ottenere qualche dettaglio in più su questo errore. Ho trovato un numero di errori con il seguente messaggio:

  

Il messaggio con A   ' http: // localhost: 1242 / WebProj / filetransfer.svc / mex / mex '   non può essere elaborato dal ricevitore,   a causa di una mancata corrispondenza di AddressFilter a   EndpointDispatcher. Controllalo   il mittente e il destinatario   EndpointAddresses sono d'accordo.

Quale sarebbe stato utile per me ma ho anche trovato lo stesso errore per:

  

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

nella stessa traccia e sono stato in grado di autenticarmi bene senza errori che mi hanno fatto chiedermi se questo errore è qualcosa di cui dovrei preoccuparmi (se qualche organismo ha un suggerimento sul perché c'è un mex / mex in il mio endpoint, sarebbe fantastico).

Quindi, perché non è possibile serializzare 'System.Web.HttpInputStream'? Di seguito ho fornito gli altri aspetti importanti del mio codice. Forse qualcuno là fuori può vedere qualcosa che mi è mancato?

[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);

}

Ecco il mio metodo UploadFile che sta restituendo l'errore.

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>  

Ecco il codice nella mia applicazione Web che chiama il metodo di caricamento:

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

Grazie per l'aiuto.

È stato utile?

Soluzione

Non è possibile definire un contratto dati con un membro Stream. Puoi prendere o restituire uno Stream come parametro singolo o definire un contratto di messaggio che ha un singolo MessageBodyMember di tipo Stream, ma può avere più MessageHeader. Per ulteriori informazioni sullo streaming di dati di grandi dimensioni in WCF, fare riferimento a questa sezione di MSDN .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top