WCF Data Services によって配置されるデータは、HTTP MERGE 要求により変更できます。データ インスタンスのプロパティのほとんどの値は、メソッドによって変更できますが、データ インスタンスのキー プロパティは変更できません。MERGE 要求は、エンティティ型、リンク、ナビゲーション プロパティ、および複合型に適用できます。詳細については、「MERGE メソッド (WCF Data Services)」を参照してください。
1 つのプロパティを更新するための MERGE 要求
MERGE 要求により変更されるデータは、HTTP 要求の一部となる文字列として書式設定されます。URI "https://localhost:50781/AdvWksSalesS.svc/Address(2)" の場合、MERGE 要求は、AdventureWorksModel 内にある ID=2 の Address エンティティを最初に識別します。Address エンティティの AddressLine1 プロパティに対する変更は、構文 "{AddressLine1:'1600 1st St.'}" で指定します。変更するエンティティが継承階層の一部である場合は、__metadata 構文要素が必要になります。
"{__metadata:{Uri:'/Address(2)/', " +
"Type:'AdventureWorksModel.Address'}, " +
"AddressLine1:'500 5th St.'}"
JSON 構文を使用して AddressLine1 プロパティの更新データを表す完全な例を、この記述の末尾のコード ブロックに示しています。
このコードは、AdventureWorksModel の Address エンティティの AddressLine1 プロパティを更新します。HttpWebRequest r は、そのコンストラクターの単一のパラメーターとして、変更するエンティティの URI https://localhost:50781/AdvWksSalesS.svc/Address(2) を使用して作成されます。既に解説しているとおり、要求の本文は requestPayload という名前の文字列に割り当てられます。メソッドは "MERGE" に設定されます。ContentType は json プロトコルに割り当てられます。r.Accept = "application/json" 行は、json プロトコルを使用してエンコードした応答 (応答がある場合) を返すようにサーバーに指示します。
サービスが HTTP 基本認証などのトランスポート ベースの認証スキームで保護されている場合は、資格情報を、要求に割り当てることによって渡すことができます。この例では、DefaultCredentials を使用しています。
要求 r は Unicode テキストとして書式設定されます。要求の Stream オブジェクトにデジタル データを書き込むために、UTF8Encoding 変数を使用して要求の長さ (バイト単位) が取得されます。HttpWebResponse オブジェクトは、要求に対して GetResponse を呼び出すことによって割り当てられます。コード r.GetResponse はデータを送信し、応答を取得します。もう 1 つの Stream オブジェクト rspStm は、GetResponseStream によって返されたデータの格納に使用します。
HttpWebRequest r =
WebRequest.Create("https://localhost:50781/AdvWksSalesS.svc/Address(2)")
as HttpWebRequest;
// __metadata is only required if inheritance is used,
// but __metadata syntax is used for completeness.Simple syntax:
//string requestPayload = "{AddressLine1:'1600 1st St.'}";
string requestPayload = "{__metadata:{Uri:'/Address(2)/', " +
"Type:'AdventureWorksModel.Address'}, " +
"AddressLine1: '1600 1st St.'}";
r.Method = "MERGE";
UTF8Encoding encoding = new UTF8Encoding();
r.ContentLength = encoding.GetByteCount(requestPayload);
r.Credentials = CredentialCache.DefaultCredentials;
r.Accept = "application/json";
r.ContentType = "application/json";
//Write the payload to the request body.using (Stream requestStream = r.GetRequestStream())
{
requestStream.Write(encoding.GetBytes(requestPayload), 0,
encoding.GetByteCount(requestPayload));
}
try
{
HttpWebResponse response = r.GetResponse() as HttpWebResponse;
string responseBody = "";
using (Stream rspStm = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(rspStm))
{
textBoxResponse.Text = textBoxResponse.Text +
"Response Description: " +
response.StatusDescription;
textBoxResponse.Text = textBoxResponse.Text +
"Response Status Code: " + response.StatusCode;
textBoxResponse.Text =
textBoxResponse.Text + "\r\n\r\n";
responseBody = reader.ReadToEnd();
}
}
textBoxResponse.Text = "Success: " +
response.StatusCode.ToString();
}
catch (System.Net.WebException ex)
{
textBoxResponse.Text = textBoxResponse.Text +
"Exception message: " + ex.Message;
textBoxResponse.Text = textBoxResponse.Text +
"\r\nResponse Status Code: " + ex.Status;
textBoxResponse.Text = textBoxResponse.Text + "\r\n\r\n";
// get error details sent from the server
StreamReader reader =
new StreamReader(ex.Response.GetResponseStream());
textBoxResponse.Text = textBoxResponse.Text +
reader.ReadToEnd();
}
参照
概念
方法: リソースからデータを取得する (WCF Data Services)
方法: エンティティ データをリソースとして挿入する (WCF Data Services)
方法: リソースとしてのエンティティ データを削除する (WCF Data Services)
その他の技術情報
一般的な HTTP 要件 (ADO.NET Data Services)