我有一大堆javascript代码,使用jQuery.post将一些数据发送到使用HttpListener的.NET应用程序。
这是js:
$.post("http://localhost:8080/catch", { name: "John", time: "2pm" },
function(data) {
alert(data);
});
和C#:
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
StreamReader reader = new StreamReader(request.InputStream);
string s2 = reader.ReadToEnd();
Console.WriteLine("Data received:" + s2);
// Obtain a response object.
HttpListenerResponse response = context.Response;
// Construct a response.
string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// Get a response stream and write the response to it.
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
// You must close the output stream.
output.Close();
post请求没问题,.NET应用程序读取数据确定,但JS代码似乎没有得到响应。触发jQuery.post的回调函数,但 data 总是未定义。为简洁起见,我省略了一些C#,我将前缀设置为监听器。
为什么我没有收到客户端数据的任何想法?
编辑:我应该补充一点,当我运行带有HttpFox的JS时,我得到Http代码200,'NS_ERROR_DOM_BAD_URI',我认为这与“http:// localhost: 8080 / catch“我的目标是,但是当我在firefox中点击该资源时,我得到的HTML响应很好,它注册为GET,200。
编辑:我将响应简化为“喵”,这就是小提琴手给我的全部回复:
HTTP/1.1 200 OK
Content-Length: 4
Content-Type: text/html
Server: Microsoft-HTTPAPI/2.0
Date: Fri, 15 Apr 2011 12:58:49 GMT
meow
答案 0 :(得分:1)
不要忘记same origin policy restriction。除非您的javascript托管在http://localhost:8080
上,否则您将无法向此网址发送AJAX请求。也不允许使用其他端口号。如果您希望这样做,则需要在http://localhost:8080
提供的HTML页面上托管您的javascript文件。或者让您的服务器发送JSONP,但这仅适用于GET请求。
备注:确保通过将一次性资源包装在using statements中来妥善处理服务器,否则您的服务器可能会开始泄漏网络连接句柄。
答案 1 :(得分:1)
不要忘记通过关闭响应来释放资源。
在响应上调用Close将强制响应通过底层套接字发送,然后将Dispose所有的一次性对象。
在您的示例中,仅在输出流上调用Close方法。这将通过套接字发送响应,但不会处理与响应相关的任何资源,包括您引用的输出流。
// Complete async GetContext and reference required objects
HttpListenerContext Context = Listener.EndGetContext(Result);
HttpListenerRequest Request = Context.Request;
HttpListenerResponse Response = Context.Response;
// Process the incoming request here
// Complete the request and release it's resources by call the Close method
Response.Close();
答案 2 :(得分:0)
我没有看到内容类型的设置。将内容类型设置为text/html
。
response.ContentType = "text/html";
答案 3 :(得分:0)
您可以大量简化编写代码。只需使用:
// Construct a response.
string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
context.Response.Write(responseString);
不需要OutputStream
或大部分其他代码。如果您确实有理由使用它,请注意您实际上不应该关闭OutputStream
。当您使用Resopnse.OutputStream
时,您正在检索对它的引用,但您没有获得所有权。它仍由Response
对象拥有,并且在请求结束时处置Response
时将正确关闭。