【问题标题】:jQuery POST to a .NET HttpListener and back againjQuery POST 到 .NET HttpListener 并再次返回
【发布时间】:2011-08-05 17:51:55
【问题描述】:

我有一段 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();

发布请求正常,.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

【问题讨论】:

    标签: c# javascript http


    【解决方案1】:

    不要忘记same origin policy restriction。除非您的 javascript 托管在 http://localhost:8080 上,否则您将无法向此 URL 发送 AJAX 请求。也不允许使用不同的端口号。如果您想让它工作,您需要将您的 javascript 文件托管在从http://localhost:8080 提供的 HTML 页面上。或者让您的服务器发送JSONP,但这仅适用于 GET 请求。

    备注:请确保通过将一次性资源包装在 using statements 中来正确处理服务器上的一次性资源,否则您的服务器可能会开始泄漏网络连接句柄。

    【讨论】:

    • 这不太可能是有问题的原因。好像是服务器的位置
    • 是的,都是本地的。这个 JS 实际上是从我正在制作的 firefox 扩展中执行的。这个想法是右键单击一个有趣的 URL 并将其发送到本地计算机上运行的进程。我正在尝试自动化 Web 应用程序的一些非常繁琐的调试。所以请求确实通过了,我在回调中得到了响应,只是没有任何数据。
    • @LoveMeSomeCode 你试过我的吗?
    • @Aliostad 是的,到目前为止还没有运气。仍在获取回调客户端,但没有数据。
    【解决方案2】:

    不要忘记通过关闭响应来释放资源。

    对响应调用 Close 将强制通过底层套接字发送响应,然后释放其所有一次性对象。

    在您的示例中,仅在输出流上调用 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();
    

    【讨论】:

      【解决方案3】:

      我没有看到内容类型的设置。将内容类型设置为text/html

      response.ContentType = "text/html";
      

      【讨论】:

      • 我尝试了你的建议,但没有骰子。我在设置 ContentLength64 之前设置了它。我仍然会触发 javascript 回调,然后由于数据未定义而引发错误。
      • 使用 fiddler 捕获响应并更新您的问题。
      • 好主意,但我安装了 fiddler 2,它似乎不适用于 localhost。我可以发誓有一个显示这些东西的 Firefox 扩展。我去看看。
      • 什么是有效载荷?快点!请您将答案粘贴到问题中好吗????
      • 好的,我的意思是按原样发布数据(包括标头在内的所有 HTTP 响应)。如果你在 cmets 中输出,它会丢失所有非常重要的换行符。
      【解决方案4】:

      您可以大大简化编写代码。就用这个吧:

              // Construct a response.
              string responseString = "<HTML><BODY> Hello world!</BODY></HTML>";
              context.Response.Write(responseString);
      

      不需要OutputStream 或大部分其他代码。如果您确实有理由使用它,请注意您实际上不应该关闭OutputStream。当您使用 Resopnse.OutputStream 时,您正在检索对它的引用,但您没有获得所有权。它仍然归Response 对象所有,并且在请求结束时释放Response 时会正确关闭。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-14
        • 1970-01-01
        • 1970-01-01
        • 2014-03-23
        • 2014-06-21
        • 2011-02-20
        • 2011-06-11
        • 1970-01-01
        相关资源
        最近更新 更多