2009-10-27 3 views
1

Я пытаюсь создать службу загрузки WCF файл, и я получаю следующее сообщение об ошибке в моем веб-приложение:Тип «System.Web.HttpInputStream» не может быть сериализовать

Тип «System.Web.HttpInputStream ' не может быть сериализован. Рассмотрите маркировку с атрибутом DataContractAttribute и отметьте все его членов, которые вы хотите сериализовать с атрибутом DataMemberAttribute. См. документацию для других поддерживаемых типов .

На основании этой ошибки, я попытался повторно маркировки мой класс 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; 
} 

Я пытался доступ к моей службы журнала трассировки с Service Trace Viewer до Посмотрите, могу ли я получить более подробную информацию об этой ошибке. Я обнаружил ряд ошибок со следующим сообщением:

Сообщение с To «» http://localhost:1242/WebProj/filetransfer.svc/mex/mex не могут быть обработаны в приемнике, из-за несоответствия AddressFilter на EndpointDispatcher. Проверьте, согласны ли адреса отправителя и получателя .

Что было бы полезно для меня, но я также нашел ту же ошибку для:

«http://localhost:1242/WebProj/auth.svc/mex/mex»

в одной и той же трассе, и я был в состоянии проверить подлинность просто отлично без любые ошибки, которые заставляли меня задаться вопросом, является ли эта ошибка чем-то, о чем я должен беспокоиться (если у какого-либо органа есть предположение о том, почему на моей конечной точке есть 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 

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

+0

Возможный дубликат http://stackoverflow.com/questions/1580639/type-system-web-httprequest-cannot-be-serialized –

ответ

2

Вы не можете определить контракт данных с членом Stream. Вы можете либо взять, либо вернуть Stream в качестве одного параметра или определить контракт с сообщением, в котором есть один MessageBodyMember типа Stream, но может иметь несколько MessageHeaders. Дополнительную информацию о большой потоковой передаче данных в WCF см. В this section of MSDN.

+0

Дал ему прочитать. Очень полезно. Спасибо за отзыв Дрю. –

+0

У меня есть соответствующие последующие ошибки, если вы не возражаете:
Ошибка в обоих «с существует тип«WebAPI.FileTransfer.FileUploadMessage»: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ web-06.08.09 \ 8a531a06 \ 51fdee26 \ assembly \ dl3 \ ae1f49ea \ c2031a0d_1758ca01 \ WebAPILibrary.DLL 'и' c: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ Временная ASP.NET Файлы \ web-06.08.09 \ 8a531a06 \ 51fdee26 \ App_WebReferences.7bmoffs1.dll '\t
Я уверен, что не повторяю сборки и очистил ASP.NET TEMP. Я также удалил свой сервис и снова добавил его. Какие-нибудь идеи, что я могу здесь делать? –

+0

У вас есть веб-ссылка * и *, как вы видите, ссылаясь на предварительно скомпилированную сборку данных данных (WebAPILibrary) с тем же именем пространства имен/типа в ней. Удалите свою веб-ссылку, если вы собираетесь ссылаться на внешнюю сборку. –

Смежные вопросы