为HTTP侦听器

时间:2016-03-31 09:25:55

标签: c# ajax sockets web

我想要一个解决方案,一旦向C#应用程序发出请求(通过网页上的AJAX帖子),就将数据从C#应用程序发送到Web页面,然后使用实现的项目here,I写了一个简单的控制台应用程序来监听ajax帖子。它工作得很好 - 我点击我页面上的一个按钮,将一个AJAX帖子发送到http://localhost:8081/,这是HTTP侦听器正在侦听的端口,然后监听器回调将一些数据响应回网页,然后我可以使用ajax帖子的成功函数中的数据。

我的问题 - 我需要使用从我的IIS服务器请求页面的URL http://localhost:8081/index.html来打开我的网页,然后我才能启动我的Listener并按下按钮来激活AJAX,因为如果我只是保留我的服务正在运行并导航到我的页面没有显示的URL,而是我的Listener返回的数据,而不是IIS应该提供的页面。这是因为我的Listener正在侦听的端口与IIS在为我的页面提供服务时绑定的端口相同。所以我决定将我的IIS绑定保留在端口8081上,只需将我的监听器改为监听8083,然后让我的ajax发布到8083,这样我就可以保留我的IIS服务与我正在进行的数据分开。

这是我的监听器配置:

listener = new HttpListener();
listener.Prefixes.Add("http://localhost:8083/");
listener.Prefixes.Add("http://127.0.0.1:8083/");
listener.AuthenticationSchemes = AuthenticationSchemes.Anonymous;

这是我的AJAX帖子

.ajax({
      type: "POST",
      url: 'http://localhost:8008/',
      data: test_data,
      crossDomain: true,
      dataType: 'json',
      success: function(data) {

        //Use data

      }
      });

此设置应该有效,唯一的问题是当我现在点击按钮时出现错误XMLHttpRequest cannot load http://localhost:8083/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8081' is therefore not allowed access. The response had HTTP status code 503.,这是预期的,但我不知道如何解决它。

正如Orkun Bekar所指出的那样,可以简单地将crossDomain:true和dataType:'jsonp'添加到ajax帖子中,这样可行,我现在可以联系到我的Listener,但我仍然得到{{1我尝试发回一些数据时出错。

以下是我的监听器回调中发回一些数据的部分:

No 'Access-Control-Allow-Origin'

2 个答案:

答案 0 :(得分:3)

我没有在response.OutputStream中发送数据和标题,而是将其添加到response.Headers属性中。

...
response.Headers.Add("Access-Control-Allow-Origin", "*");
response.Headers.Add("Access-Control-Allow-Methods", "POST, GET");
...

答案 1 :(得分:1)

首先,您将创建包含标题的响应字符串:

string responseConfigArray = "HTTP/1.1\r\nCache-Control: no-cache\r\nAccess-Control-Allow-Origin: *\r\n\r\n";
string imgDataArray = "data:image/jpg;base64," + base64ImageRepresentation;

然后将其转换为字节数组:

byte[] byteHttpHeaders = Encoding.UTF8.GetBytes(responseConfigArray);
byte[] concat = new byte[byteHttpHeaders.Length + imgDataArray.Length];

Buffer.BlockCopy(byteHttpHeaders, 0, concat, 0, byteHttpHeaders.Length);
Buffer.BlockCopy(imgDataArray, 0, concat, byteHttpHeaders.Length, imgDataArray.Length);

并将响应数据发送到网络:

var response = context.Response;
response.ContentLength64 = concat.Length;
response.StatusCode = 200;
response.StatusDescription = "OK";
response.OutputStream.Write(concat, 0, concat.Length);