Как заставить Фиддлера или Чарльза захватить трафик c из приложений Unity 2018 IL2 CPP - PullRequest
0 голосов
/ 22 февраля 2020

Я создал приложения для Unity 5 и Unity 2017 и могу использовать Fiddler или Charles для успешного захвата сетевого трафика c. Однако, когда я создаю приложение Unity 2018 с использованием IL2 CPP (другие приложения были созданы с. Net), приложение работает (успешно отправляет сетевой трафик c), но приложение, похоже, каким-то образом обходит Fiddler ( или Чарльз) прокси. Таким образом, Фиддлер и Чарльз не могут показать сетевой трафик c из приложения Unity 2018 IL2 CPP, хотя он может отображать трафик c из приложений Unity 5 и Unity 2017.

Обратите внимание, что все работает с Unity 5 и Unity 2017, и что в настройках SSL и т. Д. c. были настроены ранее. Кроме того, я использовал Fiddler "WinConfig" для EnableLoopback для приложения Unity 2018.

Мой вопрос: что мне нужно сделать, чтобы приложение Unity 2018 IL2 CPP показывало traffi c в Fiddler или Charles?

Обновление: Вот пример кода, который показывает, что запросы HttpClient не go через прокси, но другие (Unity) веб-запросы делают go через прокси:

public class RequestTest : MonoBehaviour
{
    public UnityEngine.UI.Text text;

    void Update()
    {
        if (Input.GetKeyUp(KeyCode.P))
        {
            StartCoroutine(yieldPing());
        }
        if (Input.GetKeyUp(KeyCode.O))
        {
            asyncPing();
        }
    }

    private IEnumerator yieldPing()
    {
        Debug.Log("This request shows up in Fiddler");
        text.text = "UWR in Coroutine";
        using (UnityWebRequest uwr = UnityWebRequest.Get("https://www.google.com/"))
        {
            yield return uwr.SendWebRequest();
        }
    }

    private async void asyncPing()
    {
        await awaitPing();
    }

    private async System.Threading.Tasks.Task<bool> awaitPing()
    {
        Debug.Log("This request also shows up in Fiddler");
        UnityWebRequest uwr = UnityWebRequest.Get("https://www.google.com/");
        text.text = "UWR in async await";
        uwr.SendWebRequest().completed += delegate
        {
            uwr.Dispose();
        };

        Debug.Log("This request does NOT show up in Fiddler???");
        text.text += "\nHttpClient in async await";
        using (System.Net.Http.HttpClient httpClient = new System.Net.Http.HttpClient())
        {
            using (System.Net.Http.HttpRequestMessage httpRequest = new System.Net.Http.HttpRequestMessage())
            {
                httpRequest.RequestUri = new System.Uri("http://www.youtube.com/");
                httpRequest.Method = System.Net.Http.HttpMethod.Get;
                using (System.Net.Http.HttpResponseMessage httpResponse = await httpClient.SendAsync(httpRequest, System.Net.Http.HttpCompletionOption.ResponseHeadersRead))
                {
                    var responseCode = (int)httpResponse.StatusCode;
                    // We will get a 304 if the content has not been modified
                    // If there is new, good content, then we will get a 200
                    return (responseCode == 200);
                }
            }
        }
    }
}

Вот настройки Unity Player: Here are the Unity Player Settings

1 Ответ

1 голос
/ 28 февраля 2020

Unity признала, что это проблема:

https://fogbugz.unity3d.com/default.asp?1222589_u6qsndet3umnp50u

https://issuetracker.unity3d.com/issues/httpclient-ignores-windows-proxy

Похоже что во время процесса генерации кода "IL2 CPP" сгенерированный код изменяет HttpClient на , а не , используя локальный прокси.

Код ниже был скопирован с здесь и, кажется, преодолевает ошибку Unity IL2 CPP:

 // might be overly complicated, there is an option to wrap the existing proxy here...
class myWebProxy : System.Net.IWebProxy
{
    private System.Net.IWebProxy wrappedProxy;
    private System.Net.ICredentials creds;
    private void init()
    {
        wrappedProxy = null;
        creds = CredentialCache.DefaultCredentials;
    }
    public myWebProxy()
    {
        init();
    }

    public myWebProxy(System.Net.IWebProxy theWrappedProxy)
    {
        init();
        wrappedProxy = theWrappedProxy;
    }
    public System.Net.ICredentials Credentials
    {
        get
        {
            if (wrappedProxy != null)
            {
                return wrappedProxy.Credentials;
            }
            else
            {
                return creds;
            }
        }
        set
        {
            if (wrappedProxy != null)
            {
                wrappedProxy.Credentials = value;
            }
            else
            {
                creds = value;
            }

        }
    }

    public Uri GetProxy(Uri destination)
    {
        if (wrappedProxy != null /* todo or Uri == certain Uri */)
        {
            return wrappedProxy.GetProxy(destination);
        }
        else
        {
            // hardcoded proxy here..
            return new Uri("http://seeplusplus:8080");
        }
    }

    public bool IsBypassed(Uri host)
    {
        if (wrappedProxy != null)
        {
            return wrappedProxy.IsBypassed(host);
        }
        else
        {
            return false;
        }

    }
}


// in your code use your new proxy
            HttpClientHandler aHandler = new HttpClientHandler();
// use your proxy!
            aHandler.Proxy = new myWebProxy();
            HttpClient client = new HttpClient(aHandler);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...