我试图从Windows服务中调用Rest API。我以前从未尝试过。我不确定为什么无法拨打此电话。
我的代码:
string urlParameter = "posts/1";
var client = new HttpClient();
client.BaseAddress = new Uri("http://jsonplaceholder.typicode.com/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = client.GetAsync(urlParameter).Result;
if (response.IsSuccessStatusCode)
{
var dataObj = response.Content.ReadAsAsync<IEnumerable<MyType>>().Result;
}
我收到以下错误:
消息:发送请求时发生错误。
内部异常消息:{“基础连接已关闭:连接意外关闭。”}
内部异常堆栈跟踪位于
System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)处的System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult )
在以下行上生成此错误:
HttpResponseMessage response = client.GetAsync(urlParameter).Result;
任何建议,将不胜感激。
编辑:(更新的代码)
string urlParameter = "posts/1";
var client = new HttpClient();
client.BaseAddress = new Uri("http://jsonplaceholder.typicode.com/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try
{
//var response = await client.GetAsync(urlParameter);
var task = client.GetAsync(urlParameter);
task.Wait();
var response = task.Result;
if (response.IsSuccessStatusCode)
{
var dataObj = response.Content.ReadAsAsync<IEnumerable<MyType>>().Result;
}
}
catch (Exception ex)
{
string a = ex.Message;
string b = ex.ToString();
}
编辑2:(仍然收到相同的错误)
private static async void TestAPI2()
{
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Get", "application/json");
var response = await client.GetAsync("http://jsonplaceholder.typicode.com/posts/1");
string context = await response.Content.ReadAsStringAsync();
}
}
您的问题是...
var response = client.GetAsync(urlParameter);
...返回一个任务,您需要先等待它完成。
拨打电话的最干净的方法是这样的...
var response = await client.GetAsync(urlParameter);
...这需要代码在这样的异步方法中运行...
public async Task Foo()
{
var response = await client.GetAsync(urlParameter);
}
...或者您可以简单地告诉编译器使用...
var task = client.GetAsync(urlParameter);
task.Wait();
var response = task.Result;
...或更紧凑的版本可能是使用像这样的延续...
var result = await client.GetAsync(urlParameter)
.ContinueWith(t => t.Result.Content.ReadAsAsync<IEnumerable<MyType>>())
.Unwrap();
...它将执行请求,然后在请求返回时异步为您解析并解包该任务,并返回“内部结果”,因为此代码创建了Task >>,而您只希望IEnumerable,因此等待解包的Task得到您2个任务一个接一个地执行的结果:)
...我查看了您的特定代码,并在新的控制台应用程序中运行了该代码,请将其更新为...
class MyType
{
public int userId { get; set; }
public int id { get; set; }
public string title { get; set; }
public string body { get; set; }
}
static void TestAnApiCall()
{
string urlParameter = "posts/1";
var client = new HttpClient();
client.BaseAddress = new Uri("http://jsonplaceholder.typicode.com/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
try
{
//var response = await client.GetAsync(urlParameter);
var task = client.GetAsync(urlParameter);
task.Wait();
var response = task.Result;
if (response.IsSuccessStatusCode)
{
var readTask = response.Content.ReadAsAsync<MyType>();
readTask.Wait();
var dataObj = readTask.Result;
Console.WriteLine(JsonConvert.SerializeObject(dataObj));
}
}
catch (Exception ex)
{
string a = ex.Message;
string b = ex.ToString();
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句