WCF 服务正在从客户端接收空值
WCF service is receiving null value from client
我编写了一个服务来实现执行视频处理的功能。
从客户端(控制台项目),我使用客户端服务引用调用服务的一个函数,并将 FileStream 作为参数发送给该函数(我验证它确实在客户端获得了正确的值)。
但是当 FileStream
参数到达服务时 - 我遇到空异常问题,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 请求时,FileStream 对象被序列化,然后反序列化为一个新对象,这个新对象将是一个 Stream,而不是一个 FileStream。流对象没有名称 属性。另外一点FileStream是由本地文件系统备份的。由于将文件内容发送到远程服务而不是文件系统是显而易见的,因此发送名称 属性.
是不合逻辑的
如果您的服务应用依赖于名称 属性,那么您可以使用另一个参数将名称数据发送到服务,例如:
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
}
我编写了一个服务来实现执行视频处理的功能。
从客户端(控制台项目),我使用客户端服务引用调用服务的一个函数,并将 FileStream 作为参数发送给该函数(我验证它确实在客户端获得了正确的值)。
但是当 FileStream
参数到达服务时 - 我遇到空异常问题,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 请求时,FileStream 对象被序列化,然后反序列化为一个新对象,这个新对象将是一个 Stream,而不是一个 FileStream。流对象没有名称 属性。另外一点FileStream是由本地文件系统备份的。由于将文件内容发送到远程服务而不是文件系统是显而易见的,因此发送名称 属性.
是不合逻辑的如果您的服务应用依赖于名称 属性,那么您可以使用另一个参数将名称数据发送到服务,例如:
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
}