C# içinde bir üçüncü tarafın yazdığı bir Node.js programına REST istekleri gönderen bir WebApi programı yazıyorum. Dizüstü bilgisayarımda çalışan Düğüm programının kaynak kodunu aldım, ancak Düğüm bilgim sınırlıdır. Gönderme isteklerini test etmek için Fiddler kullanıyorum. (Fiddler, Postman ve Curl'e benzer.)Bir POST isteğini kullanarak Node.js dosyasına bir görüntü dosyası göndermek için WebApi kodu yazmaya çalışıyorum
WebApi programının yapması gereken şeylerden biri POST isteğini kullanarak bir görüntü dosyası göndermektir. (Görüntü dosyası bir siparişle ilişkilendirilmiştir, bu nedenle sipariş kimliği URL'de gönderilir.) Fiddler kullanarak isteği gönderdiğimde, Düğüm Tamam'ı döndürür ve görüntü verileri başarıyla aktarılır. WebApi programını kullanarak isteği gönderdiğimde, Düğüm Tamam'ı da döndürür, ancak görüntü verileri iletilmez.
Bazı ekran görüntüleri eklemek istiyorum, ancak, görünüşe göre bunu yapmak için yeterli kredim yok. Başarılı Fiddler gönderisinde, Node.js konsolu, UploadedFileMetaData verilerini içeren bir json dizesi ve ardından order_id ve dosya adı içeren bir Json dizesi döndürür. WebApi durumunda, UploadedFileMetaData döndürülmez. Bunun yerine, döndürülen Json dizesine bayt verileri içeren bir dosya alanı eklenir.
WebApi programının isteği göndermek için yürüttüğü adımlar aşağıda listelenmiştir. Fiddler'ın dosya verilerinin doğru bir şekilde iletilmesine neden olan ne yaptığını bana söyleyen var mı? Teşekkürler.
değişkenler aşağıdaki değerlere ayarlanır: ------------ d19a2dfc4c734778b0849649617dff78 Content-Disposition: form veri
string formDataBoundary = string.Format("----------{0:N}", Guid.NewGuid());
string contentType = "multipart/form-data; boundary=" + formDataBoundary;
string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\";\r\nContent-Type: {3}\r\n\r\n",
boundary,
param.Key,
fileToUpload.FileName ?? param.Key,
fileToUpload.ContentType ?? "application/octet-stream");
string footer = "\r\n--" + boundary + "--\r\n";
(başlık dizisi şu giderir ; name = "file"; filename = "Ducky.jpg"; Content-Type: bir bellek akışı oluşturulur
image/jpeg):
Stream formDataStream = new System.IO.MemoryStream();
başlık, dosya içeriği ve altbilgi bellek akışı yazılır:
formDataStream.Position = 0;
byte[] formData = new byte[formDataStream.Length];
formDataStream.Read(formData, 0, formData.Length);
formDataStream.Close();
bir http isteği şu bilgileri içeren oluşturulur:
akışı bir bayt dizisi boşaltıldığıformDataStream.Write(encoding.GetBytes(header), 0, encoding.GetByteCount(header));
formDataStream.Write(fileToUpload.File, 0, fileToUpload.File.Length);
formDataStream.Write(encoding.GetBytes(footer), 0, encoding.GetByteCount(footer));
request.Method = "POST";
request.ContentType = contentType;
request.UserAgent = userAgent; // Value doesn't really matter
request.CookieContainer = new CookieContainer(); // Will not be used
request.ContentLength = formData.Length;
isteği nakledilir:
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(formData, 0, formData.Length);
}
Response.GetResponse() kullanarak yanıtı alıyorum. Tamam döndürür. Döndürülen içerik türü "application/json; charset = utf-8". GetResponseStream 131.072 bayt döndürür.
ContentType = "multipart/form-data" öğesini ayarlamaya çalışın. –
Denedim, ancak yardımcı olmadı. İçerik Türü'nün iki yerde ayarlandığını unutmayın. Dosya içeriğinin sınırından önce "multipart/form-data; boundary =" + formDataBoundary; Sınır içinde "image/jpeg" olarak ayarlandı.İkincisini "multipart/form-data" olarak değiştirmeyi denedim, ama dediğim gibi, yardımcı olmadı. Ayrıca, Content-Type'ın ikinci örneğini "image/jpeg" olarak ayarlamak Fiddler'da düzgün çalışıyor. – Tim
WebClient –