使用AJAX和ASP.NET MVC发送/接收byte []

时间:2016-05-17 10:41:42

标签: c# jquery ajax asp.net-mvc

概述:以下是我正在做的事情的总结说明 - 我有一个不断运行的C#应用​​程序,它包含HTTPListener并等待请求。然后有一个MVC Web应用程序,其中一个页面上是一个按钮,它触发一些JS,它将ajax发送到HTTP侦听器正在侦听的地址,当单击该按钮时,侦听器捕获此请求然后C#应用程序执行一些其他工作(与问题无关),然后生成一个字节数组。然后将此字节数组作为对原始请求的响应的一部分发回,因此使用success函数的数据参数中的字节数组触发发出请求的ajax帖子的success函数。现在又做了另一个ajax帖子,但这次是MVC控制器,这样字节数组就可以保存在我的db中了:

enter image description here 这是一些代码。

首先,这是向HTTP Listener发出请求的ajax帖子,与post一起传递的数据只是我使用的一些元数据(现在忽略success函数中的代码):

$.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 Listener的回调方法,它捕获请求并发送响应:

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&#39; returnArray&#39;):

enter image description here

请注意,我们现在将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控制器中读取的数组不同?我说的原因是,这是从Listener发送的字节数组:

enter image description here

这是MVC控制器收到的数组:

enter image description here

正如您所看到的,MVC Controller Action接收一个字符串,该字符串被拆分为两个,第二个部分转换为字节数组,第二个部分是从侦听器接收的字符串形式的字节数组(再看一下在第二个ajax帖子,你会看到它。)

我相信我采用不正确的方法发送和接收字节数据。

0 个答案:

没有答案