如何使用jQueryAjax从C#TcpListener读取HTTP响应?

如何使用jQueryAjax从C#TcpListener读取HTTP响应?,c#,ajax,httprequest,httpresponse,tcplistener,C#,Ajax,Httprequest,Httpresponse,Tcplistener,我已经用TcpListener创建了服务器,它以虚拟HTTP的形式响应每个请求。在客户端,我使用jQueryAjax向该服务器发出请求。服务器获取成功的请求并响应它 问题是,如果我通过键入地址向浏览器发出请求,它会工作,并且我可以看到结果。如果我尝试发出jQuery.ajax(…)请求,那么ajax将失败并出现错误。如果我使用Chrome inspector监视网络,我发现它甚至没有从服务器得到响应。为什么会这样 我的任务比我将与你们分享的代码要大得多。但它的行为是一样的 .NET C#@服务器

我已经用TcpListener创建了服务器,它以虚拟HTTP的形式响应每个请求。在客户端,我使用jQueryAjax向该服务器发出请求。服务器获取成功的请求并响应它

问题是,如果我通过键入地址向浏览器发出请求,它会工作,并且我可以看到结果。如果我尝试发出jQuery.ajax(…)请求,那么ajax将失败并出现错误。如果我使用Chrome inspector监视网络,我发现它甚至没有从服务器得到响应。为什么会这样

我的任务比我将与你们分享的代码要大得多。但它的行为是一样的

.NET C#@服务器端:

使用系统;
使用系统文本;
使用System.Net.Sockets;
使用系统线程;
Net系统;
命名空间服务器{
公共类服务器
{
公共静态void Main()
{
尝试
{
TcpListener TcpListener=新的TcpListener(IPAddress.Any,1234);
tcpListener.Start();
while(true)
{
Socket-Socket=tcpListener.AcceptSocket();
DummyServer服务器=新的DummyServer(套接字);
Thread thrd=新线程(new ThreadStart(server.Run));
thrd.Start();
}
}
捕获(例外e)
{
Console.WriteLine(“错误…”+e.StackTrace);
}
}
}
公共类DummyServer
{
公共DummyServer(套接字)
{
_插座=插座;
}
插座(u插座),;
公开募捐
{
尝试
{
//获取流
var networkStream=新的networkStream(_socket);
//从流中读取并解码为字符串
字节[]reqBuffer=新字节[32768];
int read=networkStream.read(reqBuffer,0,reqBuffer.Length);
string requestString=Encoding.UTF8.GetString(reqBuffer,0,读取);
Console.WriteLine(请求字符串);
Console.WriteLine();
//虚拟响应HTTP
字符串响应字符串=
“HTTP/1.1 200正常\r\n”+
“内容类型:application/json\r\n”+
“内容长度:15\r\n”+
“\r\n”+
“{\'test\':\'test\'}”;
控制台。写入线(响应线);
Console.WriteLine();
//写响应
字节[]respBuffer=Encoding.UTF8.GetBytes(responseString);
networkStream.Write(respBuffer,0,respBuffer.Length);
networkStream.Close();
}
捕获(例外e)
{
控制台写入线(如StackTrace);
控制台写入线(e.Message);
}
最后
{
//断开并关闭插座。
if(_socket!=null)
{
如果(_socket.Connected)
{
_socket.Close();
}
}
}
}
}
}
HTML和jQuery Ajax@客户端:


$(文档).ready(函数(){
jQuery.ajax({
网址:'http://localhost:1234',
键入:“POST”,
数据:JSON.stringify({test:“test”}),
数据类型:“文本”,
成功:功能(结果){
$(“正文”)。追加(“尼斯
”; }, 错误:函数(a、b、c){ $(“正文”)。追加(“该死的
”; } }); $(“正文”)。追加(“完成
”; });
我做错了什么?浏览器可以理解这个响应,因为它需要解析来自s*it的每个索引的html

编辑#1 我调试了DummyServer,ajax在开始写入流时出错。即使我将timeout参数设置为ajax请求并一步一步地调试它,它也会在同一步中给我带来错误(使用流)

编辑#2 当我分别写入HTTP头和数据时,数据末尾的2个字节在传输后丢失

如果我一次编写整个虚拟HTTP,那么它们就不会丢失。它看起来像NetworkStream.Write方法在我提供给它的数据之后额外写入\r\n

//虚拟响应HTTP头
字符串响应头=
“HTTP/1.1 200正常\r\n”+
“内容类型:application/json\r\n”+
“内容长度:8\r\n”+
“\r\n”
//虚拟响应数据
字符串响应数据=
"12345678";
//写头
字节[]respBuffer=Encoding.UTF8.GetBytes(responseHeader);
networkStream.Write(respBuffer,0,respBuffer.Length);
//写入数据
respBuffer=Encoding.UTF8.GetBytes(responseData);
networkStream.Write(respBuffer,0,respBuffer.Length);
networkStream.Close();
浏览器将显示123456

//虚拟响应HTTP
字符串响应字符串=
“HTTP/1.1 200正常\r\n”+
“内容类型:application/json\r\n”+
“内容长度:8\r\n”+
“\r\n”+
"12345678";
//写虚拟HTTP
字节[]respBuffer=Encoding.UTF8.GetBytes(responseHeader);
networkStream.Write(respBuffer,0,respBuffer.Length);
networkStream.Close();
浏览器将显示12345678

如果NetworkStream.Write方法在我写入的字节之后写入额外的\r\n,那么这难道不是问题吗

解决方案 您可以将jsonp与GET一起使用。getJSON(url,回调)

如果您需要POST,那么使用如下代理

正如您所看到的,不同端口和域之间存在策略问题。解决这个问题的最好办法是在您的域和端口中放置某种代理。我是和你一起做的