2010-09-17 50 views
5

我嘗試下面的代碼:我可以在UriTemplate中使用對象嗎?

[OperationContract] 
[WebInvoke(UriTemplate="/Users/Register/{user}")] 
void Register(User user); 

但是當我嘗試運行此,它告訴我UriTemplate只能包含字符串。如果我需要將一個對象傳遞給我的方法,就像在這種情況下一樣,將User對象傳遞給我的Register方法。

如果我改變WebInvoke屬性:

[WebInvoke(UriTemplate="/Users/Register/")] 

當我嘗試瀏覽到http://localhost:8000/Users/Register例如

回答

6

您僅限於UriTemplate中的字符串。您可以使用多個參數傳遞多個字符串,但不能使用複雜類型。如果你想傳遞一個複雜類型,那麼它不能在URI中的任何地方,而是在POST/PUT請求的主體中。 GET請求不包含消息正文。所以你上面的代碼可以改成這樣:

[OperationContract] 
[WebInvoke(Method = "POST", UriTemplate="/Users/Register")] 
void Register(User user); 

如果你傳遞的用戶對象,而不是通過開放的,但作爲POST請求的一部分。

+0

謝謝,你能詳細說明你的意思是部分POST請求嗎?我實際上嘗試過你之前提到過的,那就是在我的UriTemplate中有/ Users/Register,但是當我導航到http:// localhost:8000/Users/Register時,它說方法不被允許。 – Xaisoft 2010-09-17 22:22:22

+1

當你說你「瀏覽」到URL時,你是什麼意思?你只是在瀏覽器中打開它?如果是這樣,那麼當您使用[WebInvoke]屬性(您需要使用[WebGet])時,會執行GET請求,這是不允許的。 [WebInvoke]是POST/PUT/DELETE(你會看到我指定「POST」)在我上面的代碼示例中。退房:http://www.pluralsight-training.net/microsoft/olt/howtovideos.aspx?category=WCF%20REST – 2010-09-17 22:48:17

+1

哦,呃,你是對的。所有這些的基礎是,用戶將進入註冊頁面,填寫一些字段並註冊。註冊部分將由POST處理。我可以在點擊按鈕時處理它,對吧?但是什麼是阻止某人去http:// localhost:8000/Users/Register? – Xaisoft 2010-09-18 00:09:54

0

正是因爲它說的browswer顯示錯誤Method not allow。 URI字面上只能包含字符串。它們不是爲物體而製造的。如果你需要的話,你可以將它轉換爲一個用戶名或用戶名,但是你永遠不能使用複雜的對象類型作爲URI。

+0

在這種情況下,我還沒有UserId,因爲我需要先創建用戶。 – Xaisoft 2010-09-17 22:23:06

+1

我打算在Register方法中創建用戶。也許這是不好的設計? – Xaisoft 2010-09-17 22:23:29

0

你不會傳遞對象作爲查詢字符串參數(你怎麼能?它會序列化它?)你應該傳入用戶ID。

+0

查看Steve和md5sum的評論 – Xaisoft 2010-09-17 22:23:48

相關問題