2011-04-20 339 views
0

我在尋找一些建議來檢查這是否可能。 我正在寫一個允許客戶端上傳文件的wcf服務。 我想在我的Web服務中添加一個驗證層,而客戶端不必上傳文件。 因此,客戶端向文件發出wcf服務請求,但在上傳之前,我想驗證文件名,然後可能向客戶端發送請求以發送文件。 我的webservice上可能有2個接口:validatefile()uploadfile()以及validationfile()的結果,但理想情況下我想通過單個接口來完成。wcf請求客戶端

有什麼建議嗎?

編輯:驗證是檢查文件大小和文件名。因爲該文件可能是600MB,理想情況下,我需要在文件上傳之前執行檢查,但在服務中。

+0

這是一個相當廣泛的要求。除了文件名之外,你會「驗證」什麼?你想返回到客戶端的什麼(從uploadfile() - 假設你只使用一種方法)如果文件無效? – AllenG 2011-04-20 16:19:01

+0

你打算如何驗證?該服務無法訪問該文件,甚至無法確定該文件是否存在。 – 2011-04-20 17:26:00

+0

就基本而言,我們只想驗證x的文件名。這與驗證的作用無關。但我只是想執行驗證方法而不上傳文件,也沒有用戶向服務發送另一個請求。如果這是不可能的..我很高興做出迴應,如果一個關鍵是回報,然後執行文件上傳 – nologo 2011-04-21 08:05:13

回答

2

除非需要,否則不需要單獨的接口。在同一界面中同時使用Validate和Upload方法是完全可以接受的。除此之外,如果您希望強制消費者首先調用驗證,那麼您可以從Validate方法返回一個Guid「key」,然後讓消費者將此密鑰傳遞給上傳方法。沒有上傳密鑰,沒有上傳。即使採用這種方法,您也需要在上傳中進行重新驗證。

所以你的validate方法可能是這個樣子:

public string Validate(string fileName) 
{ 
    string uploadKey = null; 
    bool isValid = false; 

    //Business logic 

    if (isValid) 
    { 
     uploadKey = Guid.NewGuid().ToString(); 
     //store uploadKey 
    } 

    return uploadKey; 
} 
0

這整個就沒有意義了。您可以在第一個請求中驗證文件名和文件大小,然後客戶端可以發送另一個。這將要求您從文件名和大小中生成散列值,並將散列值保存在服務器上。在下一個請求中,您需要驗證散列=再次計算散列,然後進行判斷:爲什麼要在單獨的請求中驗證這些值,如果您必須在主要請求中再次執行該操作?如果你不這樣做,你的整個設計是脆弱和無用的。

我的做法是:

只能使用上傳方式。將文件名和文件大小放在SOAP標題中並使用流式傳輸(您可能會使用它)。流式處理允許您在開始處理(和加載)流之前閱讀SOAP頭,以便您可以驗證它們並在不加載文件的情況下將異常拋出到客戶端。