Glitch上的ASP.NET Core WebAPI无法被C#(Unity)调用求助
问题:Unity3D中C#调用Glitch上的ASP.NET WebAPI返回403 Forbidden
我在glitch.com上搭建了一个ASP.NET .NET6 WebAPI项目,接口https://ror-test.glitch.me/getip用于返回访问者IP,浏览器和Node.js调用都正常,但Unity的C#客户端调用时返回403错误。
已尝试的方法及结果
1. 使用HttpClient.GetStringAsync
代码:
HttpClient client = new HttpClient(); string response = await client.GetStringAsync(url); System.Console.WriteLine(response);
错误输出:
Unhandled exception. System.Net.Http.HttpRequestException: Response status code does not indicate success: 403 (Forbidden).
2. 使用HttpClient.GetAsync
代码:
HttpClient client = new HttpClient(); var response = await client.GetAsync(url);
返回结果:
- 响应状态:403 Forbidden
- 响应内容:显示Cloudflare拦截页面,无有效业务返回
3. Node.js调用(正常工作)
代码:
var url = "https://ror-test.glitch.me/getip"; var XMLHttpRequest = require("xhr2"); var xhr = new XMLHttpRequest(); console.log("starting"); xhr.open("GET", url); xhr.onreadystatechange = function () { if (xhr.readyState === 4) { console.log(xhr.status); console.log(xhr.responseText); }}; xhr.send();
输出:
starting 200 your ip: xx.xx.xxx.xx
问题分析
403错误源于Glitch默认使用的Cloudflare防护机制,Unity默认的HttpClient请求缺少标准浏览器的请求头标识,被识别为非正常访问请求而拦截。
解决方案
方案1:给HttpClient添加模拟浏览器的请求头
修改C#代码,补充User-Agent等关键请求头,让请求符合正常浏览器访问特征:
using System; using System.Net.Http; using System.Threading.Tasks; using UnityEngine; public class IpFetcher { public async Task<string> FetchIpAsync() { string url = "https://ror-test.glitch.me/getip"; using (HttpClient client = new HttpClient()) { // 添加浏览器标识请求头 client.DefaultRequestHeaders.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); client.DefaultRequestHeaders.Accept.ParseAdd("text/plain, */*"); try { HttpResponseMessage response = await client.GetAsync(url); response.EnsureSuccessStatusCode(); return await response.Content.ReadAsStringAsync(); } catch (HttpRequestException ex) { Debug.LogError($"请求失败:{ex.Message}"); return null; } } } }
方案2:使用UnityWebRequest(更适配Unity环境)
Unity自带的UnityWebRequest对引擎网络环境兼容性更好,同样添加请求头即可:
using UnityEngine; using UnityEngine.Networking; using System.Collections; public class UnityIpFetcher : MonoBehaviour { void Start() { StartCoroutine(GetIpCoroutine()); } IEnumerator GetIpCoroutine() { string url = "https://ror-test.glitch.me/getip"; using (UnityWebRequest request = UnityWebRequest.Get(url)) { // 设置请求头模拟浏览器 request.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"); request.SetRequestHeader("Accept", "text/plain, */*"); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { Debug.LogError($"请求错误:{request.error}"); } else { Debug.Log($"获取到IP:{request.downloadHandler.text}"); } } } }
内容的提问来源于stack exchange,提问作者Priyansh Yadav
相关产品推荐
相关产品推荐

