WCF服务正在从客户端接收null值

本文关键字:端接 null 客户端 客户 服务 WCF | 更新日期: 2023-09-27 18:25:09

我编写了一个服务,用于实现执行视频处理的功能。

从客户端(控制台项目),我使用客户端服务引用调用服务的一个函数,并将FileStream作为参数发送给该函数(我验证了它在客户端确实得到了正确的值)。

但是当FileStream参数到达服务时,我会遇到null异常问题,FileStream中没有正确的值。

我该如何解决?

我的代码:

服务:

public class VideoProcess : IVideoProcess
{
    public void UploadVideo(int VideoPartNumber, FileStream videoFile, Guid ApplicatId, Guid TransactionCode)
    {
    }
}

我的客户:

 FileStream videoFile = new FileStream(@"C:'VJob'gizmo.mp4", FileMode.Open, FileAccess.Read);     
//vpc id the client service reference
vpc.UploadVideo(2222, videoFile, new Guid("324792c9-d43c-4e38-8f94-7fc0ed2d7492"), Guid.NewGuid());

WCF服务正在从客户端接收null值

当您在服务中收到wcf请求时,FileStream对象被序列化,然后反序列化为一个新对象,这个新对象将是Stream,而不是FileStream。流对象没有Name属性。从另一个角度来看,FileStream由本地文件系统备份。由于将文件内容发送到远程服务而不是文件系统是显而易见的,因此发送Name属性是不合乎逻辑的。

如果您的服务应用程序依赖于Name属性,那么您可以使用另一个参数将名称数据发送到服务,如:

public class VideoProcess : IVideoProcess
{
    public void UploadVideo(int VideoPartNumber, Stream videoData, String videoFileName, Guid ApplicatId, Guid TransactionCode)
    {
    }
}

或者创建一个模型,然后像一样使用它

public class VideoPart {
    public Stream data {get;set;}
    public String Name {get;set;}
    public int VideoPartNumber {get;set;}
}
//then the server method signature would be
//...
public class VideoProcess : IVideoProcess
{
    public void UploadVideo(VideoPart part, Guid ApplicatId, Guid TransactionCode)
    {
        // ... some process ...
    }
}

不要在WCF中使用FileStream作为参数。FileStream是一个绑定到本地文件系统的流,所以你会在服务器端得到NullReferenceException,尽管你确实从客户端发送了一个相应的FileStream对象。我的建议如下:

使用byte[]作为WCF参数>在服务器端写入文件>本地读取文件

客户端:

    // Use byte[] as WCF parameter
    FileInfo fileInfo = new FileInfo(path);
    long length = fileInfo.Length;
    FileStream fileStream = new FileStream(path, FileMode.Open);
    byte[] buffer = new byte[length];
    fileStream.Read(buffer, 0, (int)length);
    fileStream.Close();
    UploadVideo(buffer);

服务器端:

    // write File in server side
    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, DateTime.Now.ToString("yyyyMMddHHmmss"));
    if (!Directory.Exists(path))
    {
        Directory.CreateDirectory(path);
    }
    string filePath = Path.Combine(path, "FileName");
    File.WriteAllBytes(filePath , excelByte);
    // read file locally
    using (FileStream fileStream = new FileStream(filePath , FileMode.Open, FileAccess.Read))
    {
        // TO DO
    }