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()目标框架中不存在方法.
使用下面的代码在 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)
| 归档时间: |
|
| 查看次数: |
755 次 |
| 最近记录: |