在Windows Phone 8上使用Unity发布帖子请求

Jen*_*nsB 9 c# unity-game-engine windows-phone-8 unityscript

我正在尝试从Unity平台上的Windows Phone 8上发布帖子请求.我不想使用统一WWW方法,因为这会阻止渲染(并且不是线程安全的).

以下代码适用于编辑器和Android,但在为WP8构建时,我收到以下错误.

System.Byte [] System.Net.WebClient :: UploadData(System.String,System.String,System.Byte [])`在目标框架中不存在.

此处解释了此错误的原因

这是因为Windows Phone 8使用了一种名为.NET for Windows Phone的不同版本的.NET,它缺少其他平台上可用的某些类型.您必须用不同的类型替换这些类型或自己实现它们.- http://docs.unity3d.com/Manual/wp8-faq.html

这是我的代码

using (WebClient client = new WebClient())
{
    client.Encoding = System.Text.Encoding.UTF8;
    client.Headers[HttpRequestHeader.ContentType] = "application/json";

    byte[] requestData = new byte[0];
    string jsonRequest = "{}";
    if (data != null) 
    {
        string tempRequest = Converter.SerializeToString (data);
        jsonRequest = "{\"Data\": \"" + tempRequest + "\"}";

        requestData = System.Text.Encoding.UTF8.GetBytes(jsonRequest);
    }

    // below line of code is the culprit    
    byte[] returnedData = client.UploadData(url, "POST", requestData);

    if(returnedData.Length > 0)
    {
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

我也尝试过WebRequests,但是GetResponse()会破坏它,并且HttpClient不存在.

那么,如何在Windows Phone 8上不使用WWW在Unity中发布数据呢?

根据评论请求更新 - WebRequests

这个代码,使用HttpWebRequest在编辑器和Android上工作,但在Windows Phone上抛出代码下面列出的错误.

var request = (System.Net.HttpWebRequest) System.Net.WebRequest.Create(url); 
request.ContentType = "application/json";
request.Method = "POST";

var sw = new System.IO.StreamWriter(request.GetRequestStream(), System.Text.Encoding.UTF8);

sw.Write(jsonRequest); // jsonRequest is same variable as in above code, string with json object.
sw.Close();

var re = request.GetResponse();

string resultString = "";
using (var outputStream = new System.IO.StreamReader(re.GetResponseStream(), System.Text.Encoding.UTF8))
{
    resultString = outputStream.ReadToEnd();
}

if(resultString.Length > 0)
{}
Run Code Online (Sandbox Code Playgroud)

错误1:

错误:System.IO.Stream System.Net.HttpWebRequest::GetRequestStream()目标框架中不存在方法.

错误2:

System.Net.WebResponse System.Net.HttpWebRequest::GetResponse() 在目标框架中不存在.

更新详细信息更新 - UploadStringAsync

使用此代码生成异步请求它在编辑器中再次运行良好,WP8上会抛出错误.

bool isCompleted = false;
byte[] returnedData = null;
client.UploadDataCompleted += 
   new UploadDataCompletedEventHandler((object sender, UploadDataCompletedEventArgs e) => 
{
        Debug.Log("return event");
        returnedData = e.Result;
        isCompleted =true;
});

Debug.Log("async call start");
client.UploadDataAsync(new Uri(url), requestData);

while(isCompleted == false){
    Thread.Sleep(100);
}

if(returnedData.Length > 0)
{}
Run Code Online (Sandbox Code Playgroud)

错误1

System.Void System.Net.WebClient::add_UploadDataCompleted(System.Net.UploadDataCompletedEventHandler)目标框架中不存在方法.

错误2

错误:System.Void System.Net.WebClient::UploadDataAsync(System.Uri,System.Byte[])目标框架中不存在方法.

错误3

错误:System.Net.UploadDataCompletedEventArgs目标框架中不存在类型.

错误4

错误:System.Byte[] System.Net.UploadDataCompletedEventArgs::get_Result()目标框架中不存在方法.

Jen*_*nsB 1

使用下面的代码在 Windows Phone 上运行。在 Android 和 WP8 上的编辑器中编译并运行(耶!)。iOS 上还没试过。

还在这里写了一篇关于它的文章:Create Web requests for unity that work on allplatforms, Even WP8

/// <summary>
/// Make post request to url with given paramaters
/// </summary>
/// <param name="url">URL to post data to http://server.com/method </param>
/// <param name="data">{ Data: data }</param>
/// <returns>string server response</returns>
public string PostData(string url, string data)
{
    // json request, hard coded right now but use "data" paramater to set this value.
    string jsonRequest = "{\"Data\": \"data\"}"; // the json request

    var request = System.Net.WebRequest.Create(url) as System.Net.HttpWebRequest;

    // this could be different for your server
    request.ContentType = "application/json"; 

    // i want to do post and not get
    request.Method = "POST"; 

    // used to check if async call is complete
    bool isRequestCallComplete = false;

    // store the response in this
    string responseString = string.Empty;

    request.BeginGetRequestStream(ar =>
    {
        var requestStream = request.EndGetRequestStream(ar);
        using (var sw = new System.IO.StreamWriter(requestStream))
        {
            // write the request data to the server
            sw.Write(jsonRequest);

            // force write of all content 
            sw.Flush();
        }

        request.BeginGetResponse(a =>
        {
            var response = request.EndGetResponse(a);
            var responseStream = response.GetResponseStream();
            using (var sr = new System.IO.StreamReader(responseStream))
            {
                // read in the servers response right here.
                responseString = sr.ReadToEnd();
            }
            // set this to true so the while loop at the end stops looping.
            isRequestCallComplete = true;
        }, null);

    }, null);

    // wait for request to complete before continuing
    // probably want to add some sort of time out to this 
    // so that the request is stopped after X seconds.
    while (isRequestCallComplete == false) { Thread.Sleep(50); }

    return responseString;
}
Run Code Online (Sandbox Code Playgroud)