【发布时间】:2015-10-27 04:09:26
【问题描述】:
刚刚从 Sql Server 过渡到 Microsoft 的 DocumentDB 服务,我正在努力通过他们的 REST API (https://msdn.microsoft.com/en-us/library/azure/dn803948.aspx) 创建文档。我尝试过使用 RestSharp 和 WebClient,但没有成功。我敢肯定这可能是一个简单的疏忽。下面的代码有一个 Account 对象,它只有所需的属性 (id) ...只是为了测试。任何帮助都会很棒。
public class Account
{
public string id { get; set; }
}
////////////////////////////////////
Account customerAcc = new Account
{
id = "test1"
};
////////////////////////////////////////////
var baseUrl = Environment.GetEnvironmentVariable("APPSETTING_documentDB_endpoint");
var primary_key = Environment.GetEnvironmentVariable("APPSETTING_documentDB_primary_key");
var client = new RestClient(baseUrl);
var data = "type=master&ver=1.0&sig=" + primary_key;
RestRequest restRequest = new RestRequest(Method.POST);
restRequest.RequestFormat = DataFormat.Json;
restRequest.AddHeader("Authorization", data);
restRequest.AddHeader("x-ms-date",now.ToUniversalTime().ToString());
restRequest.AddBody(customerAcc);
IRestResponse irestResponse = client.Execute(restRequest);
///////////////////////////////////// OR WITH SYSTEM.NET.WEBCLIENT
string result = "";
using (var newClient = new System.Net.WebClient())
{
newClient.Headers[System.Net.HttpRequestHeader.ContentType] = "application/json";
newClient.Headers["Authorization"] = data;
newClient.Headers["x-ms-date"] = now.ToUniversalTime().ToString();
result = newClient.UploadString(baseUrl, "POST", "{\"id\":\"test1\"}");
}
呼叫正在获得授权,但仍会收到 400 状态代码 (BAD REQUEST) 响应。我已经尝试序列化对象,并将 restRequest.AddBody 替换为 restRequest.AddParameter("application/json; charset=utf-8",json,ParameterType.RequestBody)。这没有任何影响。
【问题讨论】:
-
问题不在于客户端库,而在于请求。当请求仍然中断时,更改客户端无济于事。首先尝试使用 Postman 或 curl 之类的工具创建一个有效的 HTTP 请求,然后尝试为什么要尝试 WebClient 而不是 HttpClient 或者 DocumentDB 的 .NET 库?
-
使用 Fiddler 查看发送到服务的确切内容,并将其与文档的 [请求示例] 进行比较。文档说 400 意味着 Json 正文格式错误,但您可能会发现其他缺少的标头
-
@Panagiotis - 感谢您的建议,我会尝试 Fiddler。关于代码,我只是展示了我尝试过的两个客户端版本,但没有一起运行它们。我更喜欢 RestSharp 但很快尝试了 WebClient 以查看是否有任何变化。我没有使用 .NET 库,因为我只需要在处理程序文件中进行几次快速调用,不幸的是,所有异步要求都有问题。
标签: c# json azure restsharp azure-cosmosdb