Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Can';t让RestSharp处理DELETE和RequestBody_C#_Windows Phone 7_Windows Phone_Restsharp - Fatal编程技术网

C# Can';t让RestSharp处理DELETE和RequestBody

C# Can';t让RestSharp处理DELETE和RequestBody,c#,windows-phone-7,windows-phone,restsharp,C#,Windows Phone 7,Windows Phone,Restsharp,我发送一个带有请求正文的删除请求,其中包含以下参数: 服务器响应状态为500。我知道 curl -D- -X DELETE -d "{\"pin\":\"1111\"}" -H "Content-Type:application/json" -H "Authorization:Basic sameasinimagabove" https://myrestapiendpoint/resource/id 它是有效的。我使用最新版本的RestSharp.WindowsPhone v。104.3.3

我发送一个带有请求正文的删除请求,其中包含以下参数:

服务器响应状态为500。我知道

curl -D- -X DELETE -d "{\"pin\":\"1111\"}" -H "Content-Type:application/json" -H "Authorization:Basic sameasinimagabove" https://myrestapiendpoint/resource/id
它是有效的。我使用最新版本的RestSharp.WindowsPhone v。104.3.3.0.
有什么不对劲吗? 生成和发送请求的代码:

    RestRequest PrepareRequest(Method method, string url, IDictionary<string, object> data)
    {
        var request = new RestRequest(url, method);
        request.AddHeader("Authorization", "Basic " + "yadyadyadyada");
        request.AddHeader("X-Originator-Type", "app");
        request.AddHeader("X-Os-Type", Environment.OSVersion.Platform.ToString());
        request.AddHeader("X-Os-Version", Environment.OSVersion.Version.ToString());
        request.AddHeader("X-Device-Id", AppUtil.DeviceId);
        request.AddHeader("X-Client-Version", AppUtil.ApplicationVersion);
        request.AddHeader("Locale", System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName);
        request.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString("u"));
        if (data != null || method == Method.PUT || method == Method.POST || method == Method.DELETE)
        {
            request.RequestFormat = DataFormat.Json;
            if (data == null)
                data = new Dictionary<string, object>();
            string json = JsonParser.Serialize(data);
            request.AddParameter("application/json", json, ParameterType.RequestBody);
        }
    }

    _restClient.ExecuteAsync(request, response =>
                     {
                         _activeRequests.Remove(handle);
                         done(responseHandler(AddRequestToResponse(request, response)));
                     });
RestRequest PrepareRequest(方法、字符串url、IDictionary数据)
{
var请求=新的重新请求(url、方法);
AddHeader(“授权”、“基本”+“yadyadyadada”);
请求。添加标题(“X-发起人类型”、“应用程序”);
request.AddHeader(“X-Os-Type”,Environment.OSVersion.Platform.ToString());
request.AddHeader(“X-Os-Version”,Environment.OSVersion.Version.ToString());
AddHeader(“X-Device-Id”,AppUtil.DeviceId);
AddHeader(“X-Client-Version”,AppUtil.ApplicationVersion);
request.AddHeader(“Locale”,System.Globalization.CultureInfo.CurrentCulture.TwoLetterIsLanguageName);
request.AddHeader(“如果自”修改),DateTime.UtcNow.ToString(“u”);
if(data!=null | | method==method.PUT | | method==method.POST | | method==method.DELETE)
{
request.RequestFormat=DataFormat.Json;
如果(数据==null)
数据=新字典();
字符串json=JsonParser.Serialize(数据);
AddParameter(“application/json”,json,ParameterType.RequestBody);
}
}
_restClient.ExecuteAsync(请求、响应=>
{
_activeRequests.Remove(句柄);
完成(responseHandler(AddRequestToResponse(请求,响应));
});
之前有一个问题阻止您将任何正文内容作为删除请求的一部分发送。此错误已于修复

下面是一些使用TeamCity的REST API取消绑定构建的代码示例:

public void UnpinBuild(int buildId, string comment = null)
{
    var request = new RestRequest("builds/id:{id}/pin", Method.DELETE);
    request.AddUrlSegment("id", "" + buildId);
    if (!String.IsNullOrWhiteSpace(comment))
    {
        request.AddParameter("text/plain", comment, ParameterType.RequestBody);
    }
    Console.WriteLine("Executing '{0}' request to '{1}'...", request.Method, _restClient.BuildUri(request));
    var response = _restClient.Execute(request);
    if (response.StatusCode == HttpStatusCode.NotFound)
    {
        throw new Exception("Build does not exist for ID: " + buildId);
    }
    CheckForError(response);
    CheckForExpectedStatusCode(response, HttpStatusCode.NoContent);
}
该代码的关键部分是这一行:

request.AddParameter("text/plain", comment, ParameterType.RequestBody);

该行添加请求正文并执行其他一些相关操作,例如正确设置“内容长度”标题。

您可能发现了RestSharp中的错误

我试着在我的Windows7机器上运行你的代码(稍微简化),它似乎可以工作

var restClient = new RestClient("http://api.example.com");
var restRequest = new RestRequest("myResource", Method.DELETE);

restRequest.AddHeader("Authorization", "Basic " + "yadyadyadyada");
restRequest.AddHeader("X-Originator-Type", "app");
restRequest.AddHeader("X-Os-Type", Environment.OSVersion.Platform.ToString());
restRequest.AddHeader("X-Os-Version", Environment.OSVersion.Version.ToString());
restRequest.AddHeader("X-Device-Id", "myDeviceID");
restRequest.AddHeader("X-Client-Version", "1.2.3");
restRequest.AddHeader("Locale", System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageName);
restRequest.AddHeader("If-Modified-Since", DateTime.UtcNow.ToString("u"));

var data = new Dictionary<string, object> { { "key1", "value1" }, { "key2", "value2" }, };
var json = JsonConvert.SerializeObject(data);

restRequest.RequestFormat = DataFormat.Json;
restRequest.AddParameter("application/json", json, ParameterType.RequestBody);

restClient.Execute(restRequest);
var restClient=新的restClient(“http://api.example.com");
var restRequest=new restRequest(“myResource”,Method.DELETE);
restRequest.AddHeader(“授权”、“基本”+“yadyadyadada”);
restRequest.AddHeader(“X-Originator-Type”、“app”);
AddHeader(“X-Os-Type”,Environment.OSVersion.Platform.ToString());
AddHeader(“X-Os-Version”,Environment.OSVersion.Version.ToString());
restRequest.AddHeader(“X-Device-Id”、“myDeviceID”);
restRequest.AddHeader(“X-Client-Version”、“1.2.3”);
AddHeader(“Locale”,System.Globalization.CultureInfo.CurrentCulture.TwoLetterIsLanguageName);
restRequest.AddHeader(“如果自”修改),DateTime.UtcNow.ToString(“u”);
变量数据=新字典{{“key1”,“value1”},{“key2”,“value2”},};
var json=JsonConvert.serialized对象(数据);
restRequest.RequestFormat=DataFormat.Json;
AddParameter(“application/json”,json,ParameterType.RequestBody);
restClient.Execute(restRequest);
运行时,Fiddler显示请求有一个主体:


这似乎在普通的Windows机器上正常工作。不幸的是,我没有Windows Phone可供测试。我建议您在普通的Windows计算机和Windows Phone上尝试该代码,看看是否会得到不同的结果。

您能显示生成/执行请求的代码(使用RestSharp)吗?添加了一些显示生成请求并发送请求的代码。我怀疑它没有按照您的想法失败。我相信你的要求中包括了尸体;你能证实(使用提琴手等)你的请求确实缺少它的主体吗?我怀疑您的500的实际原因是您的数据被双重序列化。我将发布一个更详细的答案来解释这个怀疑,以及你如何解决它。非常感谢!(我在网上搜索了如何将fiddler与RestSharp结合使用,但没有找到一个好方法。您有关于如何使用的说明吗?)我使用并让它在后台运行来捕获进出我机器的所有流量(在UI的左下角显示“捕获”)。然后我只运行执行REST请求的代码。您应该会看到请求出现在左侧的列表中。双击请求以检查它,然后单击Inspector窗口中的“原始”视图以查看请求的纯文本视图(标题和正文)。问题是,我使用的是104.3.3.0版,所以它应该包含上述修复。我知道您使用的是最新版本的RestSharp,这个答案可能不会对您有任何帮助,但我为其他人发布了它。任何使用旧版本RestSharp并且在使用带有主体的DELETE时遇到问题的人都将使用Google搜索它,查看此问答,并希望意识到他们只需要升级。似乎它适用于RestClient。执行但不适用于RestClient。ExecuteAsync,请参阅