.NETCore HttpWebRequest - 旧方法不起作用
.NETCore HttpWebRequest - Old Way isn't Working
在我升级到最新的 .NetCore 之前,我能够 运行 HttpWebRequest,添加 headers 和内容类型,并从 Twitch 中提取 JSON 文件的流。由于升级,这不起作用。每次去获取响应流时,我都会收到 Web 异常。 twitch 没有任何变化,因为它仍然适用于旧 Bot。旧代码如下:
private const string Url = "https://api.twitch.tv/kraken/streams/channelname";
HttpWebRequest request;
try
{
request = (HttpWebRequest)WebRequest.Create(Url);
}
request.Method = "Get";
request.Timeout = 12000;
request.ContentType = "application/vnd.twitchtv.v5+json";
request.Headers.Add("Client-ID", "ID");
try
{
using (var s = request.GetResponse().GetResponseStream())
{
if (s != null)
using (var sr = new StreamReader(s))
{
}
}
}
我做了一些研究,发现我可能需要开始使用 HttpClient 或 HttpRequestMessage。我已经尝试过这个但是当添加 headers 内容类型时程序停止并退出。在此处的第一行之后:(使用 HttpsRequestMessage 时)
request.Content.Headers.ContentType.MediaType = "application/vnd.twitchtv.v5+json";
request.Content.Headers.Add("Client-ID", "rbp1au0xk85ej6wac9b8s1a1amlsi5");
您正在尝试添加 ContentType
header,但您真正想要的是添加 Accept
header(您的请求是 GET
和 ContentType
仅用于包含 body 的请求,例如 POST
或 PUT
).
在 .NET Core 中,您需要使用 HttpClient
,但请记住,要正确使用它,您需要利用 async
和 await
.
这是一个例子:
using System.Net.Http;
using System.Net.Http.Headers;
private const string Url = "https://api.twitch.tv/kraken/streams/channelname";
public static async Task<string> GetResponseFromTwitch()
{
using(var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.twitchtv.v5+json"));
client.DefaultRequestHeaders.Add("Client-ID", "MyId");
using(var response = await client.GetAsync(Url))
{
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync(); // here we return the json response, you may parse it
}
}
}
在我升级到最新的 .NetCore 之前,我能够 运行 HttpWebRequest,添加 headers 和内容类型,并从 Twitch 中提取 JSON 文件的流。由于升级,这不起作用。每次去获取响应流时,我都会收到 Web 异常。 twitch 没有任何变化,因为它仍然适用于旧 Bot。旧代码如下:
private const string Url = "https://api.twitch.tv/kraken/streams/channelname";
HttpWebRequest request;
try
{
request = (HttpWebRequest)WebRequest.Create(Url);
}
request.Method = "Get";
request.Timeout = 12000;
request.ContentType = "application/vnd.twitchtv.v5+json";
request.Headers.Add("Client-ID", "ID");
try
{
using (var s = request.GetResponse().GetResponseStream())
{
if (s != null)
using (var sr = new StreamReader(s))
{
}
}
}
我做了一些研究,发现我可能需要开始使用 HttpClient 或 HttpRequestMessage。我已经尝试过这个但是当添加 headers 内容类型时程序停止并退出。在此处的第一行之后:(使用 HttpsRequestMessage 时)
request.Content.Headers.ContentType.MediaType = "application/vnd.twitchtv.v5+json";
request.Content.Headers.Add("Client-ID", "rbp1au0xk85ej6wac9b8s1a1amlsi5");
您正在尝试添加 ContentType
header,但您真正想要的是添加 Accept
header(您的请求是 GET
和 ContentType
仅用于包含 body 的请求,例如 POST
或 PUT
).
在 .NET Core 中,您需要使用 HttpClient
,但请记住,要正确使用它,您需要利用 async
和 await
.
这是一个例子:
using System.Net.Http;
using System.Net.Http.Headers;
private const string Url = "https://api.twitch.tv/kraken/streams/channelname";
public static async Task<string> GetResponseFromTwitch()
{
using(var client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/vnd.twitchtv.v5+json"));
client.DefaultRequestHeaders.Add("Client-ID", "MyId");
using(var response = await client.GetAsync(Url))
{
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync(); // here we return the json response, you may parse it
}
}
}