因此我知道如何在Windows窗體應用程序中託管WCF服務。 但是,如何獲得與表單上的控件進行交互的服務。 例如,我想要Web服務調用將圖像加載到圖片控件中。請讓我知道,如果你找到了一個方法來做到這一點。你可以這樣做就像是低於在Windows窗體應用程序中託管交互式Web服務
0
A
回答
0
的一種方式......
注:我是有點擔心這種做法,可能會想知道更多關於你想要做這樣的事情之前,要達到什麼但爲了回答你的問題,這裏是...
假設你想允許某人發送一張圖片在窗體上的圖片框中顯示,所以從服務開始,它可能看起來像這個:
[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);
相關問題
- 1. Windows窗體應用程序在Windows託管服務上運行
- 2. 在Windows窗體中託管MVVMLight WPF應用程序
- 3. WCF服務託管在Windows服務+ Silverlight + Silverlight應用程序
- 4. Windows窗體應用程序可以與Windows通用應用程序交互嗎?
- 5. Windows窗體作爲非託管應用程序的子窗口
- 6. 自託管的Web API服務爲Windows窗體
- 7. Windows Azure的Web應用程序託管
- 8. 在Web應用程序中託管Wcf服務庫
- 9. 在ASP.NET MVC Web應用程序中託管WCF服務
- 10. 在Android應用程序中託管Web服務
- 11. 在同一Web應用程序中託管WCF服務和WebAPI
- 12. 在Windows服務應用程序中自行託管ASP.NET Web API的問題
- 13. Web服務器來託管我的MVC4 Web應用程序
- 14. 託管的Windows服務中託管的WCF服務使用WCF服務應用程序連接
- 15. Web應用程序託管
- 16. Windows窗體應用程序和SQL Server託管?
- 17. 在WPF應用程序內託管WCF Web服務
- 18. 在本地服務器上託管Web應用程序
- 19. 訪問在Windows EC2服務器上託管的應用程序
- 20. Windows窗體應用程序中的Windows服務
- 21. 託管在IIS(Windows 10)上時無法在Web應用程序中託管LocalDB
- 22. 帶Web應用程序的Windows窗體
- 23. GDI在Windows服務和交互式應用程序中的句柄
- 24. 託管自己的web應用程序的Node.js或使用託管服務
- 25. 在Windows窗體應用程序中包含ASP Web服務項目
- 26. Windows服務中的Web應用程序
- 27. 網站託管和從android應用程序調用web服務
- 28. 從Windows 8應用程序調用本地Web服務(自託管WCF)
- 29. 使用Windows服務從Windows窗體應用程序
- 30. 自託管(WinForm)WCF服務如何與主窗體進行交互?
您需要將代碼執行返回到UI線程。一些IDesign示例演示了這一點。 – stephenl 2012-04-09 14:53:00
你嘗試了什麼? – JotaBe 2012-04-09 14:57:27