Unity WWW Post провал в WebGL

У меня есть класс, который не работает при работе в WebGL, но он работает в UNITY IDE (5.6.1f1 Personal (Plus) Edition.) Код "обрезается" ниже, но дает те же характеристики (не так, как WebGL, и работает w/ нет проблем в UNITY IDE.) Я указываю это на URL службы и получаю правильный ответ при тестировании, но сообщение фактически никогда не происходит при запуске из WebGL и будет аварийно завершать работу при отсутствии ответа (даже ошибки) получено. Я хотел бы узнать мнение сообщества (может быть, мне нужно установить конкретный параметр сборки или изменить реализацию кода?) Полезная обратная связь будет принята с благодарностью. Спасибо.

-------------------- Классы Wrapper и JSON Utility ----------------

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JsonTest : MonoBehaviour {

    JsonCommunicationManager jsonComm;

    // Use this for initialization
    void Start () {

    }

    // Update is called once per frame
    void Update () {

    }

    public void OnMouseDown()
    {

        var jsonCommunications = gameObject.AddComponent<JsonCommunicationManager>();
        string tempReturn = jsonCommunications.PostStartUpRequest("{\"userId\":1,\"id\":1}");
        Debug.Log("JSON RequestStartParms: Response :  " + tempReturn);

    }
}


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class JsonCommunicationManager : MonoBehaviour
{

    private WWW wwwForm;


    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {

    }

    public string PostStartUpRequest(string JsonPostMessage)
    {

        Debug.Log("Inside PostMessage:");

        string JsonReturnMessage;

        StartCoroutine(PostWWWMessage(JsonPostMessage));

        bool boolResponse = false;

        do
        {
            Debug.Log("Checking for Response ");
            try
            {
                JsonReturnMessage = wwwForm.text;
                boolResponse = true;
            }
            catch
            {
                WaitForResponse();
                Debug.Log("Inside JsonPost Message:  WAIT");
            }
        } while (!boolResponse);

        JsonReturnMessage = wwwForm.text;

        Debug.Log("Inside JsonPost Message: Messgae Response Received: ");
        Debug.Log("Inside JsonPost Message: Messgae Response Data: " + JsonReturnMessage);
        Debug.Log("Inside JsonPost Message: Messgae Response Received: ");
        Debug.Log("Inside JsonPost Message: Messgae Response Error: " + wwwForm.error);
        Debug.Log("Inside JsonPost Message: Messgae Response Received: ");

        return JsonReturnMessage;
    }

    //private void PostWWWMessage(string JsonPostMessage) {
    private IEnumerator PostWWWMessage(string JsonPostMessage)
    {

        Debug.Log("Inside PostWWWMessage:");
        Dictionary<string, string> headers = new Dictionary<string, string>();
        headers.Add("Content-Type", "application/json");
        byte[] postData = System.Text.Encoding.ASCII.GetBytes(JsonPostMessage.ToCharArray());
        string fullyQualifiedURL = "https://jsonplaceholder.typicode.com/posts";

        Debug.Log("Inside PostWWWMessage: Posting Message: " + JsonPostMessage);
        print("Posting start up request to: " + fullyQualifiedURL);
        print("Post Data is:                " + postData);
        print("Post Header is:              " + headers);
        wwwForm = new WWW(fullyQualifiedURL, postData, headers);

        WaitForResponse();

        yield return null;

    }

    private IEnumerator WaitForResponse()
    {
        yield return new WaitForSeconds(1);
    }



}

1 ответ

Это то, что происходит, когда вы пытаетесь создать полную программу, не понимая сопрограммы. Я призываю вас создать новый проект, найти учебник сопрограмм и изучить, как он работает. Я думаю, что это лучший способ понять сопрограмму.

Что-то не так в вашем коде:

1. Пытаться ждать в void функция с сопрограммой. Это где ты звонил WaitForResponse() внутри PostStartUpRequest функция. Это не будет ждать, потому что PostStartUpRequest является пустой функцией. Делать PostStartUpRequest IEnumerator функция затем подождите с yield return WaitForResponse();,

2. Имея while петля в void функция, которая ожидает изменения другого состояния переменной в другой функции. while (!boolResponse); это плохая идея, если вы не делаете это из другой ветки, но это не так. Это заморозит Unity, так как вы не даете другим функциям возможности работать. Вы можете исправить это, добавив yield return null; внутри цикла while, который ожидает кадр после каждой проверки. Это позволяет другим функциям работать. Вы должны изменить PostStartUpRequest функция к IEnumerator функция для того, чтобы сделать это.

do
{
    //Wait for a frame
    yield return null;
    ....
} while (!boolResponse);

Авария, которую вы получите, скорее всего, происходит отсюда.

3. Когда вы позвонили WaitForResponse(); функция от PostWWWMessage функция ожидания в течение 1 секунды, которая не должна работать, потому что вы не уступаете. Вы должны ждать WaitForResponse() Функция, чтобы закончить ожидание. Вы делаете это, принося это.

Которые должны быть yield return WaitForResponse(); вместо WaitForResponse(),

4. Не правильно ждать WWW просьба закончить. Веб-запрос зависит от скорости работы устройства и интернета. Иногда это может занять больше, чем секунда, которую вы ждете. Вы должны уступить WWW запрос вместо wiating в течение 1 секунды.

//Make request
wwwForm = new WWW(fullyQualifiedURL, postData, headers);
//Wait for request to finish
yield return wwwForm;

//Now you can safely use it:
JsonReturnMessage = wwwForm.text;

5. Не проверяйте наличие ошибок перед тем, как получить доступ к результату веб-запроса.

Прежде чем получить доступ к результату, вам нужно проверить наличие возможных ошибок, иначе ожидать, что что-то произойдет, например, получить null значения с сервера.

if (String.IsNullOrEmpty(wwwForm.error))
{
   //No Error. Access result
    JsonReturnMessage = wwwForm.text;
}else{
   //Error while making a request
   Debug.Log(wwwForm.error);
}

Наконец, я не могу сказать, почему у вас так много функций для простого веб-запроса. Просто используйте одну функцию, чтобы сделать это.

private WWW wwwForm;

// Use this for initialization
void Start()
{
    StartCoroutine(PostWWWMessage("Test"));
}

//private void PostWWWMessage(string JsonPostMessage) {
public IEnumerator PostWWWMessage(string JsonPostMessage)
{

    Debug.Log("Inside PostWWWMessage:");
    Dictionary<string, string> headers = new Dictionary<string, string>();
    headers.Add("Content-Type", "application/json");
    byte[] postData = System.Text.Encoding.ASCII.GetBytes(JsonPostMessage.ToCharArray());
    string fullyQualifiedURL = "https://jsonplaceholder.typicode.com/posts";

    Debug.Log("Inside PostWWWMessage: Posting Message: " + JsonPostMessage);
    print("Posting start up request to: " + fullyQualifiedURL);
    print("Post Data is:                " + postData);
    print("Post Header is:              " + headers);
    wwwForm = new WWW(fullyQualifiedURL, postData, headers);
    //Wait for the request
    yield return wwwForm;

    string JsonReturnMessage;
    //Check for error
    if (String.IsNullOrEmpty(wwwForm.error))
    {
        //No Error. Access result
        JsonReturnMessage = wwwForm.text;
        Debug.Log("Received: " + JsonReturnMessage);
    }
    else
    {
        //Error while making a request
        Debug.Log(wwwForm.error);
    }
}
Другие вопросы по тегам