发送/接收byte []使用AJAX和ASP.NET MVC
概述:下面是我正在做的事情的总结说明 - 我有一个不断运行的C#应用程序,它包含一个HTTPListener并等待请求。 然后有一个MVC Web应用程序,其中一个页面是一个按钮,它触发一些JS,它会在HTTP侦听器正在侦听的地址上执行ajax张贴,单击该按钮时,侦听器捕获此请求,然后C#应用程序执行一些其他工作(与问题无关),然后生成一个字节数组。 然后,这个字节数组被送回作为响应原始请求的一部分,所以success
的AJAX后发出请求的功能被触发,在成功的函数的参数数据的字节数组。 现在又创建了一个ajax文章,但是这次到了MVC控制器,以便字节数组可以保存在我的数据库中:
这是一些代码。
首先,下面是向HTTP Listener发出请求的ajax帖子,与帖子一起传递的数据仅仅是我使用的一些元数据(现在忽略成功函数中的代码):
$.ajax({
type: "POST",
url: 'http://127.0.0.1:8089/',
data: '{ "Action":"Enroll", "RefUser":"6" }',
crossDomain: true,
success: function (data) {
//Code that posts array to server to be saved in DB
}); //end of ajax
这里是HTTP侦听器的回调方法,它捕获请求并发送响应:
var context = listener.EndGetContext(listenerresult);
Thread.Sleep(1000);
var data_text = new StreamReader(context.Request.InputStream,context.Request.ContentEncoding).ReadToEnd();
//functions used to decode json encoded data.
JavaScriptSerializer js = new JavaScriptSerializer();
RequestConfiguration RequestConfig = (RequestConfiguration)js.Deserialize(data_text, typeof(RequestConfiguration));
byte[] templateDataArray = null;
//Do some work and assign value to the byte array, 'templateDataArray'
//I append a status code and a message to the array of bytes and send everthing back as a response
//The values are split using the '<>' characters.
byte[] msgDataArray = System.Text.Encoding.UTF8.GetBytes("1<>Success" + "<>");
byte[] responseArray = new byte[msgDataArray.Length + templateDataArray.Length];
msgDataArray.CopyTo(responseArray, 0);
templateDataArray.CopyTo(responseArray,msgDataArray.Length);
var response = context.Response;
response.ContentLength64 = responseArray.Length;
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Methods", "POST, GET");
response.StatusCode = 200;
response.StatusDescription = "OK";
response.OutputStream.Write(responseArray, 0, responseArray.Length);
response.OutputStream.Close();
现在看看原始ajax文章的成功功能:
...
success: function (data) {
//Code that posts array to server to be saved in DB
var returnArray = data.split("<>");
if (returnArray[0] === "1") {
alert(returnArray[1]);
$("#Loader").addClass('hide');
$.ajax({
type: "POST",
url: '@Url.Action("EnrollFingerprintToDB")',
dataType: 'json',
data: { enrollData: NewID + '<>' + returnArray[2] },
success: function (data) {
alert(data.msg);
}
});//end of inner ajax
} //end of if
} //end of success
...
当我做一个示例运行时,这里是我回到成功函数中的内容,让我们看看它被分割后的数据(var'returnArray'):
请注意,我们现在将returnArray[2]
到包含字节数组(现在编码为字符串)的MVC控制器。 这是捕获该帖子的mvc控制器:
[HttpPost]
public ActionResult EnrollFingerprintToDB(string enrollData)
{
string[] sDataParts = enrollData.Split(new[] { "<>" }, StringSplitOptions.None);
var bytes = System.Text.Encoding.UTF8.GetBytes(sDataParts[1]);
if (FingerprintBLL.InsertFingerprintTemplate(int.Parse(sDataParts[0]),bytes))
{
return Json(new { success = true, msg = "Template successfully saved" });
}
else
{
return Json(new { success = true, msg = "Template could not be saved" });
}
}
什么关心我,我的问题是什么
为什么我从监听器发出的数组与我最终在MVC控制器中读取的数组不同? 我说的原因是,这是从监听器发送的字节数组:
这里是MVC控制器收到的数组:
正如你所看到的MVC控制器行动接受一个字符串被分成两部分,第二部分被转换成一个字节数组,第二部分是从监听器接收到的字符串形式的字节数组(再看看第二部分阿贾克斯后,你会看到它)。
我相信我正在采取错误的方法来发送和接收字节数据。
链接地址: http://www.djcxy.com/p/6677.html