Skip to main content
 首页 » 编程设计

c#之.NETCore HttpWebRequest之旧方法不起作用

2024年02月05日27mfryf

在我升级到最新的 .NetCore 之前,我能够运行 HttpWebRequest,添加 header 和内容类型,并从 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。我已经尝试过这个但是当添加标题内容类型时程序停止并退出。在此处的第一行之后:(使用 HttpsRequestMessage 时)

request.Content.Headers.ContentType.MediaType = "application/vnd.twitchtv.v5+json"; 
request.Content.Headers.Add("Client-ID", "rbp1au0xk85ej6wac9b8s1a1amlsi5"); 

请您参考如下方法:

您正在尝试添加一个 ContentType header ,但您真正想要的是添加一个 Accept header (您的请求是一个 GET并且 ContentType 仅用于包含正文的请求,例如 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 
        } 
    }     
}