在HttpWebRequest中使用c#添加预告片

我试图在HttpWebRequest标题中添加尾部,但它不是在文件数据结束之后追加尾部。

wreq.ContentType = "application/octet-stream"; wreq.AllowWriteStreamBuffering = false; wreq.SendChunked = true; //wreq.Headers.Add(HttpRequestHeader.Te, "trailers"); wreq.Headers.Add(HttpRequestHeader.Trailer, "Test"); wreq.Headers["Test"] = "the-value"; using (Stream POSTstream = wreq.GetRequestStream()) { //dataByte is file-data in byte[] POSTstream.Write(dataByte, 0, dataByte.Length); POSTstream.Flush(); //hashValue is trailer in byte[] POSTstream.Write(hashValue, 0, hashValue.Length); POSTstream.Flush(); POSTstream.Close(); } 

它应该在空白块之后追加这个“Test”@ EOF的预告片,但是它不会追加它。 当我试图以编程方式添加预告片时,将其视为文件数据而不是预告片。

预期的要求:

 POST <URL> HTTP/1.1 Content-Type: application/octet-stream Trailer: Test Transfer-Encoding: chunked 5d File-data 0 Test: the-value 

实际要求:

 POST <URL> HTTP/1.1 Content-Type: application/octet-stream Trailer: Test Transfer-Encoding: chunked 5d File-data 5A Test: the-value 0 

为什么这个testing预告片没有得到空白块。 该预告片将在服务器上用于识别文件的结尾。 请帮忙。

经过一个多星期的研究,我才知道Dotnet不允许在httprequest中添加预告片。 为了达到预期的要求,我使用了Node.js. 为了那个原因,

首先,我创build了app.js文件,其中包含用拖车创build请求的代码,并从服务器获取响应:

 var http = require('http'); var fs = require('fs'); var options = {hostname: 'ABC',port: 6688,path: 'XYZ/101/-3/test.file',method: 'POST', headers: {'Content-type' : 'application/octet-stream','Trailer' : 'Test','Transfer-Encoding': 'chunked'}}; var fileContent = fs.readFileSync('C:\\test.file'); var req = http.request(options, function(res) { res.setEncoding('utf8'); res.on('data', function (chunk) {fs.writeFile('C:\\response.xml', chunk);});}); req.on('error', function(e) {fs.writeFile('C:\\response.xml','Error: ' + e.message);}); var len = fileContent.length; var bufSize = 4096; for (var i = 0 ; i < len ; ) { if (i+bufSize <len){req.write(fileContent.slice(i, i+bufSize));} else{req.write(fileContent.slice(i,len));req.addTrailers({'Test': 'TESTTEST'});req.end();}i = i +bufSize; } 

从dotnet运行这个app.js文件作为应用程序,并得到响应:

 //build app.js file content var template = GetAppJSString(); var appjsfile = "C:\\app.js"; using (var sw = new StreamWriter(appjsfile)) { sw.Write(template); sw.Close(); } var psi = new ProcessStartInfo { CreateNoWindow = true, FileName = "C:\\Node.exe", Arguments = "\"" + appjsfile + "\"", UseShellExecute = false, WindowStyle = ProcessWindowStyle.Hidden }; try { _nodeProcess.StartInfo = psi; _nodeProcess.Start(); _nodeProcess.WaitForExit(); //read and process response var responseText = string.Empty; using (var sr = new StreamReader("C:\\response.xml")) { responseText = sr.ReadToEnd(); sr.Close(); } File.Delete("C:\\response.xml"); // process response } catch (Exception ex) { } 

希望这会帮助别人,节省时间。