2011-07-15 22 views
1

Webサービスを使用する必要があるアプリケーションを開発しています。.NETでJSON Webサービスを使用し、マルチパートPOSTを使用してデータを要求する最良の方法

Webサービスは、リモートサーバー上で実行されていて、それがPOSTリクエストを受け付けて、ここで

を使用してサービスを消費するためのサンプルであるJSONデータを返すコンテンツと

curl -F "api_key=ABCDEFGHIJKL" -F "[email protected]_string.json" "http://serv/api/v4/song/identify" 

HTTPのPOSTリクエストを「カール」 - すべてのパラメータがポストボディにあり、クエリがポスト "ファイル"の "クエリ"パラメータにある "multipart/form-data"を入力します。

.NETでサービスを使用するにはどうすれば実装できますか

答えて

2

WCF REST serviceparse the multipart/form-dataを使用できます。


UPDATE:

申し訳ありませんが、私はあなたの質問を読み違えます。あなたはクライアントを書く方法を探していました。私のblog postでは、パラメータと共にmultipart/form-dataが有効なサービスに複数のファイルをアップロードできるサンプルクラスを提案しました。それはこのように書きます:

public class UploadFile 
{ 
    public UploadFile() 
    { 
     ContentType = "application/octet-stream"; 
    } 
    public string Name { get; set; } 
    public string Filename { get; set; } 
    public string ContentType { get; set; } 
    public Stream Stream { get; set; } 
} 

してから仕事をする方法:

public byte[] UploadFiles(string address, IEnumerable<UploadFile> files, NameValueCollection values) 
{ 
    var request = WebRequest.Create(address); 
    request.Method = "POST"; 
    var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x", NumberFormatInfo.InvariantInfo); 
    request.ContentType = "multipart/form-data; boundary=" + boundary; 
    boundary = "--" + boundary; 

    using (var requestStream = request.GetRequestStream()) 
    { 
     // Write the values 
     foreach (string name in values.Keys) 
     { 
      var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine); 
      requestStream.Write(buffer, 0, buffer.Length); 
      buffer = Encoding.ASCII.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"{1}{1}", name, Environment.NewLine)); 
      requestStream.Write(buffer, 0, buffer.Length); 
      buffer = Encoding.UTF8.GetBytes(values[name] + Environment.NewLine); 
      requestStream.Write(buffer, 0, buffer.Length); 
     } 

     // Write the files 
     foreach (var file in files) 
     { 
      var buffer = Encoding.ASCII.GetBytes(boundary + Environment.NewLine); 
      requestStream.Write(buffer, 0, buffer.Length); 
      buffer = Encoding.UTF8.GetBytes(string.Format("Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"{2}", file.Name, file.Filename, Environment.NewLine)); 
      requestStream.Write(buffer, 0, buffer.Length); 
      buffer = Encoding.ASCII.GetBytes(string.Format("Content-Type: {0}{1}{1}", file.ContentType, Environment.NewLine)); 
      requestStream.Write(buffer, 0, buffer.Length); 
      file.Stream.CopyTo(requestStream); 
      buffer = Encoding.ASCII.GetBytes(Environment.NewLine); 
      requestStream.Write(buffer, 0, buffer.Length); 
     } 

     var boundaryBuffer = Encoding.ASCII.GetBytes(boundary + "--"); 
     requestStream.Write(boundaryBuffer, 0, boundaryBuffer.Length); 
    } 

    using (var response = request.GetResponse()) 
    using (var responseStream = response.GetResponseStream()) 
    using (var stream = new MemoryStream()) 
    { 
     responseStream.CopyTo(stream); 
     return stream.ToArray(); 
    } 
} 

し、最終的にクライアント:

using (var stream1 = File.Open("test.txt", FileMode.Open)) 
using (var stream2 = File.Open("test.xml", FileMode.Open)) 
using (var stream3 = File.Open("test.pdf", FileMode.Open)) 
{ 
    var files = new[] 
    { 
     new UploadFile 
     { 
      Name = "file", 
      Filename = "test.txt", 
      ContentType = "text/plain", 
      Stream = stream1 
     }, 
     new UploadFile 
     { 
      Name = "file", 
      Filename = "test.xml", 
      ContentType = "text/xml", 
      Stream = stream2 
     }, 
     new UploadFile 
     { 
      Name = "file", 
      Filename = "test.pdf", 
      ContentType = "application/pdf", 
      Stream = stream3 
     } 
    }; 

    var values = new NameValueCollection 
    { 
     { "key1", "value1" }, 
     { "key2", "value2" }, 
     { "key3", "value3" }, 
    }; 

    byte[] result = UploadFiles("http://localhost:1234/upload", files, values); 
    // TODO: process the result 
} 
+0

私は申し訳ありませんが、サーバーがすでに実装されており、必要性何らかの方法でクライアントを実装し、カールを使わずにサーバーにリクエストを送信し、サーバーにJSONデータでファイルをアップロードする –

+0

@kdhuleshia、申し訳ありませんが、私はあなたの質問を誤解しました。私の更新を見てください。 –

+0

上記のサンプル –

関連する問題