jQuery POST到.NET HttpListener并再次返回

时间:2011-04-14 17:24:14

标签: c# javascript http

我有一大堆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

4 个答案:

答案 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时将正确关闭。