2016-03-28 7 views
0

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.

+0

ContentType = "multipart/form-data" öğesini ayarlamaya çalışın. –

+0

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

+0

WebClient –

cevap

0

Bence işte size başka basit bir çözüm.

//// Upload api written in expressjs. 


var apiUpload = "http://localhost:3000/upload"; 
      var filePath =Server.MapPath("~/App_Data/1023.jpg"); 
      using (var client = new WebClient()) 
      { 
       var responseBytes = client.UploadFile(apiUpload, "POST", filePath); 
       var result = System.Text.Encoding.UTF8.GetString(responseBytes); 
      } 

ExpressJs ile basit bir yükleme API'si oluşturdum ve yukarıdaki örnekle düzgün çalıştım.

+0

gibi başka bir yol denemelisiniz. Bu yaklaşım, yüklediğim dosya sabit diskimde olduğu sürece işe yarar. Maalesef dosyalar Azure Cloud'da. Dosya içeriğini bayt dizisi olarak kabul eden, ancak diğer yöntemle aynı şekilde başarısız olan client.UploadData() kullanmayı denedim. Dosyaları yüklemeden önce sabit sürücüme geçici olarak indirebilirim. Yine de bundan kaçınmayı tercih ederim. – Tim

+0

Alex Nguyen - Önceden gittim ve bulut dosyalarını sabit diskimdeki dosyaları geçici olarak yazdım, ardından bunları yayınlamak için kodunuzu kullandım. Bir çekicilik gibi çalıştı. Yardım ettiğin için teşekkür ederim. – Tim