概述:以下是我正在做的事情的总结说明 - 我有一个不断运行的C#应用程序,它包含HTTPListener并等待请求。然后有一个MVC Web应用程序,其中一个页面上是一个按钮,它触发一些JS,它将ajax发送到HTTP侦听器正在侦听的地址,当单击该按钮时,侦听器捕获此请求然后C#应用程序执行一些其他工作(与问题无关),然后生成一个字节数组。然后将此字节数组作为对原始请求的响应的一部分发回,因此使用success函数的数据参数中的字节数组触发发出请求的ajax帖子的success
函数。现在又做了另一个ajax帖子,但这次是MVC控制器,这样字节数组就可以保存在我的db中了:
首先,这是向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;):
请注意,我们现在将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发送的字节数组:
这是MVC控制器收到的数组:
正如您所看到的,MVC Controller Action接收一个字符串,该字符串被拆分为两个,第二个部分转换为字节数组,第二个部分是从侦听器接收的字符串形式的字节数组(再看一下在第二个ajax帖子,你会看到它。)
我相信我采用不正确的方法发送和接收字节数据。