方法: エンティティ データをリソースとして挿入する (WCF Data Services)
HTTP POST 要求を使用して新しいデータを WCF Data Services に追加できます。POST 要求は、キー、リンク、ナビゲーション プロパティ、およびサービス操作によって指定されるエンティティ セットに適用できます。詳細については、「POST メソッド (WCF Data Services)」を参照してください。
新しいエンティティを挿入するための POST 要求
POST 要求により挿入されるデータは、HTTP 要求の一部となる文字列として書式設定されます。URI "https://localhost:50781/AdvWksSalesS.svc/Address" の場合、POST 要求は、AdventureWorksModel に設定された Address エンティティを最初に識別します。変更するエンティティが継承階層の一部である場合は、__metadata 構文要素が必要になります。
"{__metadata:{Uri:'/Address/', " +
"Type:'AdventureWorksModel.Address'}}"
JSON 構文を使用して Address エンティティ セットの新しいデータ項目を表す例を、この記述の末尾のコード ブロックに示しています。
このコードは、AdventureWorksModel を配置するデータ サービスに新しい Address エンティティを追加します。HttpWebRequest r は、そのコンストラクターの単一のパラメーターとして、挿入するエンティティ型の URI https://localhost:50781/AdvWksSalesS.svc/Address を使用して作成されます。新しい項目のプロパティのデータを構成するいくつかの変数の初期化には、JSON 形式のシリアル化が必要になります。DateTime のシリアル化は複雑な変換であり、JSON コード ライブラリにより管理することが推奨されますが、これにはシリアル化が含まれています。JSON のシリアル化の詳細については、「JSON シリアル化ルール (ADO.NET Data Services)」を参照してください。stateProvinceId に割り当てられた整数と rowGuid に割り当てられた Guid は、requestPayload 文字列のシリアル化でシリアル化されます。
既に解説しているとおり、要求の本文は requestPayload という名前の文字列に割り当てられます。メソッドは "POST" に設定されます。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")
as HttpWebRequest;
DateTime creationDate = DateTime.Now;
// Convert the date to JSON format.long ticks = (creationDate.ToUniversalTime().Ticks -
(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).Ticks) / 10000;
Int32 stateProvinceId = 79;
Guid rowGuid = Guid.NewGuid();
// __metadata is only required if inheritance is used.string requestPayload = "{__metadata:{Uri:'/Address/', " +
"Type:'AdventureWorksModel.Address'}, " +
"AddressLine1:'703 NW 170th St.', " +
"City:'Kirkland', StateProvinceID:" +
stateProvinceId.ToString() +
", PostalCode:'98021', rowguid:'" +
rowGuid.ToString() +
"', ModifiedDate:'\\/Date(" + ticks + ")\\/'}";
r.Method = "POST";
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)
方法: リソースとしてのエンティティ データを削除する (WCF Data Services)