jQuery POST到.NET HttpListener,然后再返回
jQuery POST到.NET HttpListener,然后再返回
我有一段使用jQuery.post发送数据到使用HttpListener的.NET应用程序的JavaScript代码。
以下是JavaScript代码:
$.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); // 获取响应对象。 HttpListenerResponse response = context.Response; // 构造响应。 string responseString = " 你好,世界!"; byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); // 获取响应流并将响应写入其中。 response.ContentLength64 = buffer.Length; System.IO.Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); // 必须关闭输出流。 output.Close();
POST请求成功发送并且.NET应用程序成功读取数据,但是JavaScript代码似乎无法获取到响应。jQuery.post的回调函数触发,但是data始终为未定义。由于篇幅原因,我省略了一些设置监听器前缀的C#代码。
有什么想法为什么我无法在客户端获取到数据吗?
编辑:我应该补充一点,当我使用HttpFox运行JavaScript时,我得到了Http状态码200,“NS_ERROR_DOM_BAD_URI”,我认为这与我所指定的“http://localhost:8080/catch”有关,但是当我在Firefox中访问该资源时,我可以正常获取到HTML响应,并且以GET,200的形式注册。
编辑:我将响应简化为“meow”,以下是完整响应的Fiddler输出:
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
这篇文章讨论了一个问题,即通过jQuery POST到.NET HttpListener并再次返回的问题。问题的原因是未设置content-type,解决方法是将content-type设置为"text/html"。
最初,问题的提问者提到没有设置content-type,建议设置为"text/html"。然而,即使按照建议设置了content-type,仍然出现了问题,javascript回调函数仍然报错,因为data未定义。
有人建议使用Fiddler来捕获响应并更新问题。但是,提问者安装了Fiddler 2后发现它在本地主机上无法正常工作。提问者决定尝试使用HttpFox并发现它可以与本地主机一起使用,并显示了许多信息。根据HttpFox的显示结果,HTTP结果是200,类型是"NS_ERROR_DOM_BAD_URI"。但是,由于使用HttpListener,提问者没有真正的资源可以访问,只是将数据发送到"http://localhost:8080/catch"。
另一个人提到他在本地使用Fiddler,对本地的请求也有效。他给出了一个链接,提问者打算尝试解决Fiddler忽略本地请求的问题。
提问者在设置contentType后,发现无论如何响应的状态码都是200。他使用firefox发起请求时,状态码显示为"GET 200 text/plain",而使用JS代码发起请求时,状态码显示为"POST 200 application/xml(NS_ERROR_DOM_BAD_URI)"。在更改contentType后,状态码变为"POST 200 text/html(NS_ERROR_DOM_BAD_URI)"。
有人建议输出整个HTTP响应以查看是否有缺少的头信息。提问者安装了Fiddler,并通过Fiddler成功捕获到响应。Fiddler的TextView面板显示的响应是"4(newline)meow(newline)0",并指出响应已编码。通过点击"transform"按钮,可以将响应更改为"meow"。
然后,提问者查看了原始响应,发现响应中包含"Transfer-Encoding: chunked Server: Microsoft-HTTPAPI/2.0"。有人指出这可能是问题所在。
提问者继续研究如何禁用chunked编码。他找到了一个网站,指出如果指定ContentLength64,则不会使用chunked编码。他尝试将ContentLength64添加回去,并发现Fiddler不再显示chunked编码,只显示了响应中的文本。但是,JS回调函数仍然没有数据。
有人建议移除ContentLength64行。提问者尝试了这个建议,但是情况变得更加奇怪。即使没有回调函数,HttpFox和Firebug仍然报告响应有问题。但是,Fiddler显示响应正常。
提问者认为问题可能与Firefox对响应头的某些不喜欢有关。根据提问者的发现,Firefox可能会抱怨他正在对不同域进行XSS操作。
有人要求提问者提供响应的完整数据。提问者回答说,响应中只包含"meow"这个字符串,没有chunking、0或4。他认为这可能是jQuery的问题。
最后,有人要求提问者以原样发布整个HTTP响应,包括头信息。提问者表示会这样做。
根据以上内容,可以整理出问题的原因是未设置content-type,解决方法是设置content-type为"text/html"。同时,还需要解决chunked编码的问题,以及Firefox对响应头的限制。
问题的原因是同源策略限制。除非JavaScript托管在http://localhost:8080
上,否则无法向该URL发送AJAX请求。不允许使用不同的端口号。如果要使其工作,您需要在从http://localhost:8080
提供的HTML页面上托管JavaScript文件。或者让服务器发送JSONP,但这仅适用于GET请求。
问题的解决方法是将JavaScript文件托管在从http://localhost:8080
提供的HTML页面上,以确保满足同源策略的要求。另外,服务器端应该正确处理可释放资源,可以通过使用using语句将其包装起来,以防止网络连接句柄泄漏。
根据对话内容的描述,还可以看出问题可能是服务器位置的原因,因为该JavaScript是从一个正在制作的Firefox扩展中执行的。该扩展的想法是右键单击一个有趣的URL并将其发送到本地运行的进程。可能需要进一步检查服务器的位置设置。
对话中还提到了其他尝试的解决方法,但没有成功,仍然在客户端获得回调,但没有数据返回。
因此,根据上述内容总结,问题的原因是同源策略限制,解决方法是将JavaScript文件托管在同一源上,并确保正确处理可释放资源。
问题的原因是在使用HttpListener和jQuery进行POST请求时,没有正确释放资源。在给出的示例代码中,只调用了Output流的Close方法,这只会通过socket发送响应,但不会释放与响应相关的任何资源,包括引用的output流。
解决方法是调用Response的Close方法来完成请求并释放相关资源。这将强制响应通过底层socket发送,并且会Dispose所有可释放的对象。
下面是修改后的示例代码:
// 完成异步GetContext并引用所需的对象 HttpListenerContext Context = Listener.EndGetContext(Result); HttpListenerRequest Request = Context.Request; HttpListenerResponse Response = Context.Response; // 在此处处理传入的请求 // 调用Close方法完成请求并释放资源 Response.Close();
通过调用Response的Close方法,可以确保请求被正确处理并释放相关资源。