HttpWebRequest POST(ADO.NET 数据服务框架)
通过使用 HTTP POST 请求可以向 ADO.NET 数据服务添加新的数据。可将 POST 请求应用于由键、链接、导航属性和服务操作标识的实体集。有关更多信息,请参见 POST 方法(ADO.NET 数据服务框架)。
用于插入新实体的 POST 请求
将由 POST 请求插入的数据将格式化为一个字符串,该字符串将成为 HTTP 请求正文的一部分。首先,POST 请求通过以下 URI 标识 AdventureWorksModel
中的 Address
实体集:"https://localhost:50781/AdvWksSalesS.svc/Address"
如果要修改的实体是继承层次结构的一部分,则 __metadata
语法元素是必需的:
"{__metadata:{Uri:'/Address/', " +
"Type:'AdventureWorksModel.Address'}}"
此说明结尾处的代码块中演示了一个使用 JSON 语法表示 Address
实体集的新数据项的完整示例。
该代码将新的 Address
实体插入到部署 AdventureWorksModel
的数据服务中。使用要插入的实体类型的 URI https://localhost:50781/AdvWksSalesS.svc/Address
(作为其构造函数的单个参数)创建 HttpWebRequest r
。若要初始化若干个组成新项的属性数据的变量,需要采用 JSON 格式进行序列化。DateTime 序列化是一项复杂的转换,在 JSON 代码库中可以更好地对其进行管理,但是此处包括了序列化。有关 JSON 序列化的更多信息,请参见 JSON 序列化规则(ADO.NET 数据服务框架)。初始化 requestPayload
字符串时,将对分配给 stateProvinceId
的整数和分配给 rowGuid
的 Guid
进行序列化。
如前面所述,请求的正文将分配给一个名为 requestPayload
的字符串。方法将设置为 "POST"
。ContentType
将分配给 json
协议。r.Accept = "application/json"
行告知服务器发送回使用 json
协议编码的响应(如果有)。
如果利用基于传输的身份验证方案(如 HTTP 基本身份验证)对服务进行保护,则可以通过将凭据分配给请求的方式来传递凭据。对于此示例,使用 DefaultCredentials
。
请求 r
的格式将设置为 Unicode 文本。UTF8Encoding 变量用于获取请求的长度(以字节为单位),以便将数字数据写入到 Stream 请求对象中。通过对请求调用 GetResponse
来分配 HttpWebResponse
对象。代码 r.GetResponse
将发送数据并获取响应。另一个 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();
}
另请参见
概念
POST 方法(ADO.NET 数据服务框架)
HttpWebRequest PUT(ADO.NET 数据服务框架)
HttpWebRequest GET(ADO.NET 数据服务框架)
HttpWebRequest POST(ADO.NET 数据服务框架)
HttpWebRequest DELETE(ADO.NET 数据服务框架)
通用 HTTP 要求(ADO.NET 数据服务框架)
.NET 客户端库(ADO.NET 数据服务框架)