2015-12-01 64 views
1

我寫了一個服務來實現執行視頻處理的功能。我從客戶端(控制檯項目)調用服務的函數,使用客戶端服務引用,並作爲參數發送給函數FileStream(我證實它的確在客戶端得到了正確的值)。WCF服務正在從客戶端接收空值

但是,當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()); 
+0

你調試了服務代碼,看看哪裏異常正在提出? – ChrisF

+0

是的,當試圖從FileStream中獲取名稱屬性 – Shimon

+0

什麼是該代碼和什麼*精確*在這一點上爲空?將這些信息編輯到您的問題中。 – ChrisF

回答

1

當你在服務接收WCF請求,FileStream對象序列化然後反序列化到一個新的對象而這個新對象將是一個Stream,而不是FileStream。 Stream對象沒有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 ... 
    } 
} 
0

不要在WCF中使用FileStream作爲參數。 FileStream是綁定到本地文件系統的流,因此您將在服務器端獲得NullReferenceException儘管您確實從客戶端發送了一個相關FileStream對象。

使用字節[]作爲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); 

服務器端:

我的如下sugguestion
// 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 
    } 
相關問題