2009-05-13 12 views
8

入力パラメータとして送信される2〜4枚の画像ファイル(それぞれ約2k〜5k小)と約6つのテキストフィールドパラメータが必要なWCFサービスを作成しています。送り返されるデータは、単純にいくつかのテキスト値で構成されます。複数のファイルをWCFサービスに送信する最善の方法は何ですか?

1つのファイルをストリームとして送信することはできますが、複数のファイルを送信する方法についてはわかりません。

この場合のクライアントは、可能な限り単純なWCFサービスとのインターフェイスを作成したい第三者になります。

答えて

24

おそらくこれを達成する方法はたくさんありますが、ここに私の考えがあります。 私はちょうど任意の数の文字列を含んでいますので、必要に応じて追加/削除できます。

まず、イメージと文字列値を含むWCFサービスに渡される、ある種の「入力」オブジェクトが必要になります。 Imagesプロパティがバイト配列の配列であることに注意してください。これは複数の画像を含めることができるためです。

[DataContract] 
public class InputObject 
{ 
    [DataMember] 
    public byte[][] Images { get; set; } 

    [DataMember] 
    public string FirstValue { get; set; } 

    [DataMember] 
    public string SecondValue { get; set; } 
} 

次に、あなたはあなたのServiceContractは次のようになります

[DataContract] 
public class ReturnObject 
{ 
    [DataMember] 
    public string FirstValue { get; set; } 

    [DataMember] 
    public string SecondValue { get; set; } 
} 

...あなたのWCFサービスが返すオブジェクトをお勧めします。

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    ReturnObject UploadData (InputObject input); 
} 

このようなサービスクラスです。

public class Service1 : IService1 
{ 
    public ReturnObject UploadData (InputObject input) 
    { 
     // Do your thing with InputObject data 

     ReturnObject returnObject = new ReturnObject 
             { 
              FirstValue = "MyFirstValue" , 
              SecondValue = "MySecondValue" 
             }; 

     return returnObject; 
    } 
} 

サービスのバインディングがイメージデータを送信するのに適切であることを確認して、デフォルトの制限のいくつかが適切になるようにする必要があります。次に、私のサービスの設定からのバインディングの例を示します。

<wsHttpBinding> 
    <binding name="Service1Binding" maxReceivedMessageSize="1000000"> 
    <readerQuotas maxArrayLength="1000000" 
        maxBytesPerRead="1000000" 
        maxDepth="1000000" 
        maxNameTableCharCount="1000000" 
        maxStringContentLength="1000000"/> 
    </binding> 
</wsHttpBinding> 

これはサービスのバインディング設定として必ず指定してください。

<endpoint address="" 
      binding="wsHttpBinding" 
      contract="WcfService5.IService1" 
      bindingConfiguration="Service1Binding"> 

これで、クライアントのサービスからこれを参照して呼び出すだけで済みます。

+0

A非常に詳細かつ簡単に、これはあなたを助け

var images = new byte[2][]; images[0] = System.IO.File.ReadAllBytes(@"D:\Development\TestImage.bmp"); images[1] = System.IO.File.ReadAllBytes(@"D:\Development\TestImage.jpg"); var input = new InputObject { Images = images , FirstValue = "MyFirstValue" , SecondValue = "MySecondValue" }; var client = new Service1Client(); client.UploadData(input); 

希望は...例に従ってください。これはあなたのためにNagaMenschをしましたか?もしそうなら、それは受け入れに値すると思う? –

+0

NagaMensch、これはあなたの質問に答えましたか? –

+0

はい、これは非常に役に立ちました!私はByte []のコレクションであるこれの変形を使用して終了しました。 – alchemical

関連する問題