jQuery POST到.NET HttpListener,然后再返回

28 浏览
0 Comments

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

0
0 Comments

这篇文章讨论了一个问题,即通过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对响应头的限制。

0
0 Comments

问题的原因是同源策略限制。除非JavaScript托管在http://localhost:8080上,否则无法向该URL发送AJAX请求。不允许使用不同的端口号。如果要使其工作,您需要在从http://localhost:8080提供的HTML页面上托管JavaScript文件。或者让服务器发送JSONP,但这仅适用于GET请求。

问题的解决方法是将JavaScript文件托管在从http://localhost:8080提供的HTML页面上,以确保满足同源策略的要求。另外,服务器端应该正确处理可释放资源,可以通过使用using语句将其包装起来,以防止网络连接句柄泄漏。

根据对话内容的描述,还可以看出问题可能是服务器位置的原因,因为该JavaScript是从一个正在制作的Firefox扩展中执行的。该扩展的想法是右键单击一个有趣的URL并将其发送到本地运行的进程。可能需要进一步检查服务器的位置设置。

对话中还提到了其他尝试的解决方法,但没有成功,仍然在客户端获得回调,但没有数据返回。

因此,根据上述内容总结,问题的原因是同源策略限制,解决方法是将JavaScript文件托管在同一源上,并确保正确处理可释放资源。

0
0 Comments

问题的原因是在使用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方法,可以确保请求被正确处理并释放相关资源。

0