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 的整数和分配给 rowGuidGuid 进行序列化。

如前面所述,请求的正文将分配给一个名为 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 数据服务框架)