2012-04-09 16 views
0

WindowsフォームアプリケーションでWCFサービスをホストする方法を知っています。 しかし、フォーム上のコントロールとサービスをやり取りさせるにはどうすればよいですか。 たとえば、画像コントロールに画像を読み込むためのWebサービス呼び出しが必要です。あなたがこれを行う方法を見つけたら教えてください。あなたがこれを行うことができますWindowsフォームアプリケーションでの対話型Webサービスのホスト

+0

コード実行をUIスレッドに戻す必要があります。いくつかのIDesignのサンプルがこれを示しています。 – stephenl

+0

何を試しましたか? – JotaBe

答えて

0

一つの方法は...以下のように

NOTEです:私はこのアプローチについて少し心配になり、おそらくこのような何かを行う前に、あなたが達成したいかについての詳細を知りたいでしょうここであなたの質問に答えることに興味があります。

サービスから始まるように、誰かがあなたの写真をフォームの写真ボックスに表示するようにしたいとしましょうこれは:

[ServiceContract] 
public interface IPictureService 
{ 
    [OperationContract] 
    void ShowPicture(byte[] picture); 
} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 
public class PictureService : IPictureService 
{ 
    private readonly Action<Image> _showPicture; 

    public PictureService(Action<Image> showPicture) 
    { 
     _showPicture = showPicture; 
    } 

    public void ShowPicture(byte[] picture) 
    { 
     using(var ms = new MemoryStream(picture)) 
     { 
      _showPicture(Image.FromStream(ms));  
     }    
    } 
} 

ここで、画像を表示するために使用するフォームを作成します(Form1はフォームの名前、pictureBox1は問題の画像ボックスです)。そのためのコードは次のようになります。(、完全性について

public partial class Form1 : Form 
{ 
    private readonly ServiceHost _serviceHost; 

    public Form1() 
    { 
     // Construct the service host using a singleton instance of the 
     // PictureService service, passing in a delegate that points to 
     // the ShowPicture method defined below 
     _serviceHost = new ServiceHost(new PictureService(ShowPicture)); 
     InitializeComponent(); 
    } 

    // Display the given picture on the form 
    internal void ShowPicture(Image picture) 
    { 
     Invoke(((ThreadStart) (() => 
            { 
             // This code runs on the UI thread 
             // by virtue of using Invoke 
             pictureBox1.Image = picture; 
            }))); 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     // Open the WCF service when the form loads 
     _serviceHost.Open(); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     // Close the WCF service when the form closes 
     _serviceHost.Close(); 
    } 
} 

をApp.configファイルを追加し、この中に入れ明らかにあなたは、WCFは、かなりの程度まで離れて抽象化されますが、通りのサービスが本当に重要ではありませんホストサンザシ

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name=""> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service name="WindowsFormsApplication1.PictureService"> 
      <endpoint address="" binding="wsHttpBinding" contract="WindowsFormsApplication1.IPictureService"> 
       <identity> 
        <dns value="localhost" /> 
       </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
      <host> 
       <baseAddresses> 
        <add baseAddress="http://localhost:8732/WindowsFormsApplication1/PictureService/" /> 
       </baseAddresses> 
      </host> 
     </service> 
    </services> 
    </system.serviceModel> 
</configuration> 

そして、それはそれである - あなたがShowPictureの操作を画像でバイト配列を送信する場合、それはフォーム上に表示されます:私は)あなたが完全に動作する例を与えたいと思いました。

たとえば、コンソールアプリケーションを作成し、上で定義したwinformsアプリケーションでホストされているサービスにサービス参照を追加すると、メインメソッドは単にこれを持つことができます(logo.pngがフォームに表示されます)。

var buffer = new byte[1024]; 
var bytes = new byte[0]; 
using(var s = File.OpenRead(@"C:\logo.png")) 
{ 
    int read; 
    while((read = s.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     var newBytes = new byte[bytes.Length + read]; 
     Array.Copy(bytes, newBytes, bytes.Length); 
     Array.Copy(buffer, 0, newBytes, bytes.Length, read); 
     bytes = newBytes; 
    }    
} 

var c = new PictureServiceClient(); 
c.ShowPicture(bytes); 
関連する問題