2015-06-20 9 views
0

Я создавал диспетчер загрузки, который получил имя файла и ссылку на скачивание из расширения chrome.
В этом случае я решил использовать фоновый рисунок javascript для отправки XMLHttpRequest в loopback и создать простой сервер для получения сообщения, чтобы фоновая страница выглядела так.Не удается прочитать InputStream из HttpListenerRequest

background.js

function showMessageBox(info, tab) { 
    var link = decodeURIComponent(info.linkUrl); 
    var index = link.search(/[^/\\\?]+\.\w{3,4}(?=([\?&].*$|$))/); 
    var fileName = link.substring(index); 
    alert("will download from " + link + " soon\n File name : " + fileName); 
    SendMessage(fileName,link); 
} 
function SendMessage(fileName, link) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("POST","http://localhost:6230", false); 
    xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8"); 
    var JSONstring = JSON.stringify({ FileName: fileName, DownloadLink: link }); 
    xhr.send(JSONstring); 
} 

и часть сервера.

private void StartReciever() 
    { 
     while (true) 
     { 
      var fileInfo = GetFileInfo(); 
      Execute.OnUIThread(() => WindowManager.ShowDialog(
       new NewDownloadViewModel(WindowManager, EventAggregator, fileInfo, Engine))); 
     } 
    } 

    private FileInfo GetFileInfo() 
    { 
     using (var listener = new HttpListener()) 
     { 
      listener.Prefixes.Add("http://localhost:6230/"); 
      listener.Start(); 
      var requestContext = listener.GetContext(); 
      /*var streamReader = new StreamReader(requestContext.Request.InputStream, requestContext.Request.ContentEncoding); 
      string jsonString = streamReader.ReadToEnd();*/ 
      var stream = requestContext.Request.InputStream; 
      byte[] buffer = new byte[10240]; 
      var readbyte = stream.Read(buffer, 0, 102400); 
      string ss = Encoding.UTF8.GetString(buffer, 0, readbyte); 
      // deserialize string to object 

      return new FileInfo(); 
     } 
    } 

Мне интересно, почему чтение потока всегда возвращает 0 при отправке сообщения.

ответ

1

Наконец-то я нашел то, что забыл!

Согласно Same-origin policy, я не могу отправить HTTP-запрос на сервер, который не является тем же самым источником.
Я должен использовать Cross-Origin XMLHttpRequest для связи с сервером, который не совпадает с исходным кодом.

Для этого мне нужно указать Request cross-origin permissions, добавив имя хоста в раздел разрешений.
В моем случае я выгляжу так.

"permissions": [ 
"contextMenus", 
"http://localhost/", 
"nativeMessaging" 
] 

Теперь я могу получить строку и десериализировать ее.

Смежные вопросы