1

请再帮忙。我设法将一个文件从 ASP.NET 上传到我的 WCF 服务,它就像一个魅力。现在我想从 WinRT 做同样的事情但没有成功。我的文件上传服务基于这篇文章http://www.seesharpdot.net/?p=214。从 ASP.NET 我使用此代码上传文件

string filePath = Server.MapPath("~/Files/Happy.jpg");
        string fileName = "Happy.jpg";

        ServiceReference1.FileMetaData metadata = new ServiceReference1.FileMetaData();
        metadata.LocalFilename = fileName;
        metadata.FileType = ".jpg";

        fileStream = new FileInfo(filePath).OpenRead();
        oService.UploadFile(metadata, fileStream);

        byte[] buffer = new byte[2048];
        int bytesRead = fileStream.Read(buffer, 0, 2048);
        while (bytesRead > 0)
        {
          fileStream.Write(buffer, 0, 2048);
          bytesRead = fileStream.Read(buffer, 0, 2048);
        }

从 WinRT 我认为这会起作用,但事实并非如此。不会抛出异常。

FileOpenPicker openPicker = new FileOpenPicker();
          openPicker.ViewMode = PickerViewMode.Thumbnail;
          openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
          openPicker.FileTypeFilter.Add(".jpg");
          openPicker.FileTypeFilter.Add(".jpeg");
          openPicker.FileTypeFilter.Add(".png");

          StorageFile file = await openPicker.PickSingleFileAsync();
          if (file != null)
          {
            byte[] bytes = await GetByteFromFile(file);
            await App.ServiceInstance.UploadFileAsync(bytes);
          }

// This is the method to convert the StorageFile to a Byte[]          
    private async Task<byte[]> GetByteFromFile(StorageFile storageFile)
    {
      var stream = await storageFile.OpenReadAsync();

      using (var dataReader = new DataReader(stream))
      {
        var bytes = new byte[stream.Size];
        await dataReader.LoadAsync((uint)stream.Size);
        dataReader.ReadBytes(bytes);

        return bytes;
      }
    }  

有趣的是,我的 WCF 服务方法只接受一个字节数组 (byte[]) 作为参数,而忽略了 messageContract。我需要更改我的 WCF 服务吗?你会建议我如何解决这个问题?任何帮助表示赞赏。

我的 WCF 服务:

public void UploadFile(FileUploadMessage request)
    {
      Stream fileStream = null;
      Stream outputStream = null;

      try
      {
        fileStream = request.FileByteStream;

        string rootPath = HttpContext.Current.Server.MapPath("~\\Files"); ; // ConfigurationManager.AppSettings["RootPath"].ToString();
        string newFileName = Path.Combine(rootPath, request.MetaData.LocalFileName);

        outputStream = new FileInfo(newFileName).OpenWrite();
        const int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];

        int bytesRead = fileStream.Read(buffer, 0, bufferSize);

        while (bytesRead > 0)
        {
          outputStream.Write(buffer, 0, bytesRead);
          bytesRead = fileStream.Read(buffer, 0, bufferSize);
        }
      }
      catch (IOException ex)
      {
        throw new FaultException<IOException>(ex, new FaultReason(ex.Message));
      }
      finally
      {
        if (fileStream != null)
        {
          fileStream.Close();
        }
        if (outputStream != null)
        {
          outputStream.Close();
        }
      }
    }
4

1 回答 1

0

我必须实现相同的,但是库的 WinRT 生成与桌面(控制台应用程序)的库不同。

我不得不在绑定中取出 Mtom,并将 WCF 服务参数保留为 Stream 类型。

这仍然允许我根据需要上传文件。但是,在服务上,我将文件命名为 md5 校验和值。然后,Windows 8 应用程序向服务发送了另一条消息,参数是 md5 校验和(在 WinRt 设备上计算)以及文件元数据。然后,WCF 服务使用 md5 校验和查找文件并重命名该文件。

因此,从我认为的直接解决方法来看,这是一个 2 步过程,我认为我对此感到满意。

如果需要,很高兴在服务和 WinRt 端共享 md5 校验和的代码。

于 2014-01-21T23:38:06.123 回答