Skip to main content
 首页 » 编程设计

c#之.net http webclient 到 nodejs 服务器。如何访问数据

2024年02月25日37yxwkf

我有一个 .net c# 客户端软件发送这样的数据:

using(WebClient client = new WebClient()) 
{ 
    string serialisedData = ""; 
    serialisedData = JsonConvert.SerializeObject(myData); 
    client.Credentials = new NetworkCredential(config.UserData.Username, config.UserData.Password); 
    byte[] responsebyte = client.UploadData(config.ServerAddress, System.Text.Encoding.UTF8.GetBytes(serialisedData)); 
} 

在 nodejs 中,我目前有这种 https 设置:

_server = https.createServer({ 
            key: fs.readFileSync(`${__dirname}\\bin\\cert\\${_config.sslkey}`, "utf8"), 
            cert: fs.readFileSync(`${__dirname}\\bin\\cert\\${_config.sslcert}`, "utf8") 
        }, _listener); 
_server.listen(_config.port, "0.0.0.0"); 
 
function _listener(req, res) { 
    let data = [] 
    req.on('data', chunk => { 
        data.push(chunk) 
    }) 
    req.on('end', () => { 
        JSON.parse(data) 
    }) 
} 

现在是我的问题。我无法获取 req 或 res 对象的任何数据。 “开启”功能都没有触发,我现在不知道该怎么办。在 NodeJS 中执行此操作的正确方法是什么? (c#代码不能改)


编辑: 这是有效的 c# 服务器代码。我如何将其转换为 nodejs?

HttpListener listener = new HttpListener(); 
listener.Prefixes.Add($"https://+:{Config.Port}/"); 
listener.AuthenticationSchemes = AuthenticationSchemes.Basic; 
listener.Start(); 
for (; ; ) 
{ 
    Console.WriteLine("Listening..."); 
    IAsyncResult result = listener.BeginGetContext(new AsyncCallback(DoWork), listener); 
    result.AsyncWaitHandle.WaitOne(); 
    result = null; 
} 
 
private void DoWork(IAsyncResult asyncResult) 
{ 
    HttpListener listener = (HttpListener)asyncResult.AsyncState; 
    HttpListenerContext context = listener.EndGetContext(asyncResult); 
    HttpListenerRequest request = context.Request; 
    HttpListenerResponse response = context.Response; 
    HttpListenerBasicIdentity identity = (HttpListenerBasicIdentity)context.User.Identity; 
 
 
    string data; 
    using (var reader = new StreamReader(request.InputStream, request.ContentEncoding)) 
    { 
        data = reader.ReadToEnd(); 
    } 
    .... 
    More Code 
    .... 
 
    string responseSerial = JsonConvert.SerializeObject(responseData); 
    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseSerial); 
    response.ContentLength64 = buffer.Length; 
 
    System.IO.Stream output = response.OutputStream; 
    output.Write(buffer, 0, buffer.Length); 
    output.Close(); 
} 

请您参考如下方法:

你在某处缺少 res.end() 来让 Node 的服务器知道它应该发回响应。在此之前,您可以写下您的实际回复。在您的确切 C# 代码和 Node 服务器的简化版本上进行了测试:

var http = require('http'); 
 
var _server = http.createServer(_listener); 
_server.listen(1234); 
 
console.log( 'started' ); 
 
function _listener(req, res) { 
  let data = [] 
  req.on('data', chunk => { 
    data.push(chunk) 
  }) 
  req.on('end', () => { 
    JSON.parse(data); 
    res.write('response') 
    res.end() 
  }) 
}