下列清單和範例將描述 ADO.NET 資料服務之 PUT 方法所使用的通訊協定 (Protocol)。<超文字傳輸協定,RFC 2616>(英文) 所需的其他行為描述於一般 HTTP 需求 (ADO.NET 資料服務架構) 和 PUT、POST 和 DELETE (ADO.NET 資料服務架構) 中。
下列通訊協定適用於使用 PUT 方法的 HTTP 要求。
所有成功的 PUT 要求都會傳回「204 沒有內容」回應碼。
針對 ADO.NET 資料服務資源的 PUT 要求會合併要求中的內容與資源的目前狀態。這項合併作業是透過比較要求主體的每個元件與存在伺服器上的資源完成。
如果要求主體中的某個元件不在資源中,此要求就代表結構描述違規,而且會傳回「422 無法處理的實體」回應碼。
當要求主體中的元件與資源上的元件相符時,就會針對要求主體中項目的子系繼續進行比對程序。
當資源的類型是不可為 Null 時,將資源值設定為 Null 的 PUT 要求就會產生「422 無法處理的實體」回應碼。
當資源的類型沒有定義空白狀態時,將資源值設定為空白的 PUT 要求就會產生「422 無法處理的實體」回應碼。
由於 PUT 必須等冪,所以您無法使用 PUT,將資源插入資源集中。換言之,PUT 無法實作類似 POST 的附加或建立語意 (Semantics)。
系統會忽略要求裝載中任何延後的內容附註。
如果 HTTP 標頭中的要求 URI 與要求裝載中的相關聯 URI 不符,就會優先使用要求 URI。此裝載會被視為它包含要求 URI 的值。
如果 PUT 要求的主體包含在序列化 (Serialization) 資源時所操作的資源索引鍵,系統就會忽略這些索引鍵值。您無法更新資源索引鍵值。
支援 PUT 方法的類型
本文件後面的範例將摘要列出支援 PUT 方法的資源類型。如果要求的準則對於指定的資源沒有足夠的權限,支援 PUT 方法之資源類型的 PUT 要求可能會失敗。在此情況下,如<超文字傳輸協定,RFC 2616>所述,此要求會根據提供替代準則給資料服務是否可讓要求成功而定,傳回「401 未授權」回應碼或「403 禁止」回應碼。
下列範例將顯示支援或不支援 PUT 方法之 HTTP URL 路徑語法的結束項目。每個案例都包含 PUT 要求的描述以及可預測的結果。
/<EntitySet>
範例 URI 最終項目
下列 URI 範例會將實體集顯示成結束項目。
/Customers
描述:
此 PUT 方法不支援實體集當做結束項目。系統會傳回「405 不支援的方法」回應碼。
/<EntitySet>(keyPredicate)
下列 URI 範例會將 keyPredicate 顯示成結束項目。
/Customers('ALFKI')
描述:
支援 PUT 方法。
更新要求主體所提供以及 keyPredicate 所識別的單一資源類型執行個體 (Instance)。
不支援相關聯類型的深層更新。
支援繫結基數為一的關聯性端。
可將 keyPredicate 所識別的資源 R1 繫結至現有的資源:
如果 R1 僅包含現有資源 R2 的 URI 當做可識別基數為一之關聯性端的導覽或連結值,R1 就會繫結至 R2。
如果 R1 包含此 URI 和資源主體,系統就會假設此 URI 代表已經繫結至 R1 的現有資源 R2。然後,系統就會使用主體中指定的值來更新 R2。
如果 R1 僅包含主體 (但不包含相關資源 R2 的 URI) 當做導覽或連結屬性的值,系統就會傳回「400 錯誤要求」。
將等於常值 Null 的裝載傳送至這個資源會產生「400 錯誤要求」回應碼。
您無法更新組成資源索引鍵之屬性的值。如果新的值存在 PUT 要求的裝載中,系統就會忽略這些值。
下列 URI 範例會將數值索引鍵述詞 (Predicate) 顯示成結束項目。此程式碼會更新 Product #123 以及與它相關聯的分類。然後,它會重新繫結相關聯的分類。
/Products(123)
JSON 格式
{
__metadata:{ uri="/Products(123)",
type="NorthwindModel.Product" },
Name:"New product name"
Category : { __metadata: {uri:"/Category(2)" } }
}
/<NavigationProperty> 或 /<LinkProperty>
下列 URI 範例會將導覽屬性和連結屬性顯示成結束項目。
/Customers('ALFKI')/Orders
/Customers('ALKFI')/Orders(1)
/Products(1)/Category (這只適用於基數 = 1 的關聯性端)
描述:
支援 PUT 方法。
如果導覽或連結屬性可識別單一資源,或是基數為一的關聯性端:
- 使用與
/<ResourceSet>(keyPredicate)相同的語意,不過僅包含 Null 值的要求主體會從 second-to-last URI 區段所識別的資源中解除繫結此資源。
- 使用與
如果導覽或連結屬性可識別多個資源,或是關聯性的「多」端:
- 不支援,系統會傳回「405 不支援的方法」回應碼。
/<ComplexType>
下列 URI 範例會將複雜類型顯示成結束項目。
/Customers('ALFKI')/Address
描述:
支援 PUT 方法。
使用要求主體的內容來更新要求 URI 分葉所識別的複雜類型。
支援深層更新。
要求裝載可能會包含巢狀複雜類型的可更新內容。只要深度維持在內含資源類型執行個體 (Instance) 中,這類更新就沒有任何已定義的最大深度。
/<Property>
下列 URI 範例會將屬性顯示成結束項目:
/Customers('ALFKI')/FirstName
描述:
支援 PUT 方法。
支援更新屬性值。
此屬性可設定為 Null。
- JSON 會使用 Null 基本型別。
/<Property>/$value
下列 URI 範例會將屬性值顯示成結束項目:
/Customers('ALFKI')/FirstName/$value
描述:
支援 PUT 方法。
支援更新屬性的原始值。
不會提供將此值設定為 Null 的方式。
要求主體的 MIME 類型必須與伺服器上資源類型的 MIME 類型相符。
如果屬性的類型定義了空白狀態,零位元組的要求主體就會將屬性值設定為空白。否則,系統會傳回「422 無法處理的實體」回應碼。
/<ServiceOperationName>
下列 URI 範例會將服務作業名稱顯示成結束項目:
/CustomersByCity?city='London'
描述:
不支援 PUT 方法。
不會針對 ADO.NET 資料服務作業定義 PUT 動詞。
傳回「405 不支援的方法」回應碼。
PUT 要求的反覆存取限制
ADO.NET 資料服務架構支援在特定 Uri 上使用 GET 要求來傳回裝載的反覆存取案例。一般的案例是修改某些資料,然後將相同的裝載傳遞至該 Uri 的 PUT 要求中。當實體中的屬性不是索引鍵而是識別資料行時,這項作業就無法運作。唯一的解決方法是將存放結構定義語言 (SSDL) 檔案中的識別資料行變更為計算的屬性。
另請參閱
概念
HttpWebRequest GET (ADO.NET 資料服務架構)
HttpWebRequest PUT (ADO.NET 資料服務架構)
HttpWebRequest POST (ADO.NET 資料服務架構)
HttpWebRequest DELETE (ADO.NET 資料服務架構)
PUT、POST 和 DELETE (ADO.NET 資料服務架構)