2012-01-17 90 views
1

我正在編寫一個WCF webapi應用程序,並且需要檢查一個電子郵件地址是否被採用。在嘗試PUT之前,這需要客戶端代碼可以執行的查詢。WCF WebApi,處理IsThisTaken查詢的正確方法是什麼?

所以,我想要做的是使用HEAD與HTTP狀態代碼結合使用。我有點不確定如何去做,因爲這是一個簡單的是/否回答,這是必需的。所以,我用HttpResponseExceptions來返回相關的狀態碼。

[WebInvoke(Method = "HEAD", UriTemplate = "{email}")] 
    [RequireAuthorisation] 
    public void IsEmailAddressTaken(string email) 
    { 
     if (!Regex.IsMatch(email, Regexes.EmailPattern)) 
     { 
      throw new RestValidationFailureException("email", "invalid email address"); 
     } 

     if (_repository.IsEmailAddressTaken(email)) 
     { 
      throw new HttpResponseException(HttpStatusCode.OK); 
     } 

     throw new HttpResponseException(HttpStatusCode.NoContent); 
    } 

這只是沒有「氣味」對我。

首先,我要以正確的方式進行這種「是/否」操作嗎?

其次,有沒有辦法只是返回相關的狀態碼,而不必訴諸異常?

回答第二個問題

回答我的第二個問題是隻是有方法返回一個HttpResponseMessage

[WebInvoke(Method = "HEAD", UriTemplate = "{email}")] 
[RequireAuthorisation] 
public HttpResponseMessage DoesResourceExist(string email) 
{ 
    if (!Regex.IsMatch(email, Regexes.EmailPattern)) 
    { 
     return new RestValidationFailure("email", "invalid email address"); 
    } 

    if (_repository.IsEmailAddressTaken(email)) 
    { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 

    return new HttpResponseMessage(HttpStatusCode.NotFound); 
} 

回答

2

我的建議是返回HttpResponseMessage而不是拋出異常。 您的RestValidationFailureException在任何地方都可以處理嗎?如果不是,則會產生500個狀態碼,這似乎不夠。

+0

謝謝。我剛剛到達那裏:)我想我可能會添加我的解決方案到我的問題,因爲你輸入這個答案。 – 2012-01-18 12:12:39

2

我認爲這將是確定只返回確定爲「存在」和404爲「不存在」

+0

我想要一個「預先檢查」的原因是,用戶可以立即看到電子郵件已被採取,而不必在註冊頁面上填寫其餘信息。因此,我們可以直接轉到「重置密碼」頁面。當我輸入我的所有信息時,我知道我很惱火,只能被告知「此電子郵件地址已被使用」。在哪一點我記得我已經有一個帳戶! – 2012-01-17 21:51:44

+0

更新了我的回答 – 2012-01-17 21:59:37

相關問題