要測試本帖子代碼請記得管理員權限運行vs。html
我寫這個帖子的初衷是在我作surface小車的時候有相似的需求,感受這個功能還挺有意思的,因此就分享給你們,網上有不少關於wcf的文章 我就不一一列舉了。公司有個舊的項目是winform寫的,裏面就有這個內嵌的wcf,我還沒怎麼搞過wpf,你們都說winform太老了,因而乎我就想用wpf內嵌下試試看看能不能成功。git
下面是個人surface go小車的帖子。github
http://www.javashuo.com/article/p-ebhtpbkm-er.htmlweb
這個項目我是參考網上的一個帖子。不過好多網友的貼子或多或少都有幫助,可是有的沒收藏下來。我就貼上一個我以爲是乾貨的帖子吧。瀏覽器
首先咱們要確保vs裏面安裝了wcf組件。ide
如圖即安裝了桌面開發,又安裝了wcf的組件就能夠開始了。測試
管理員權限運行vs,首先新建一個wpf項目,這個你們應該都很熟悉。而後再在項目裏添加新建項。spa
名稱能夠根據本身的業務命名。添加完成會在項目引用裏多出一些dll文件。也會多出兩個cs文件,那兩個文件就是對外暴露的接口文件了,能夠寫一些業務邏輯給別人調用。orm
ServiceModel就是比較主要的dll,咱們用的一些服務都是這裏面的。下面的ServiceModel.Web是我手動添加的。
同時項目裏面的App.config配置文件會出現Wcf相關的配置。
<?xml version="1.0" encoding="utf-8" ?> <configuration> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> <system.serviceModel> <behaviors> <serviceBehaviors> <behavior name=""> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="false" /> </behavior> </serviceBehaviors> </behaviors> <services> <service name="WpfWcf.Service1"> <endpoint address="" binding="basicHttpBinding" contract="WpfWcf.IService1"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> <host> <baseAddresses> <add baseAddress="http://localhost:8733/Design_Time_Addresses/WpfWcf/Service1/" /> </baseAddresses> </host> </service> </services> </system.serviceModel> </configuration>
我是將system.serviceModel節點的相關東西都刪掉了。而後換成了以前在網上找到的配置方法。你們能夠直接拿來使用。主要是把 service name和conract相關的改爲本身的項目的就好了。
<system.serviceModel> <services> <service name="WpfTestWCF.Service1" behaviorConfiguration="default"> <endpoint address="" behaviorConfiguration="webHttp" binding="webHttpBinding" bindingConfiguration="general" contract="WpfTestWCF.IService1"> <identity> <dns value="localhost"/> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <host> <baseAddresses> <add baseAddress="http://localhost:8733/Service1"/> </baseAddresses> </host> </service> </services> <behaviors> <endpointBehaviors> <behavior name="webHttp"> <webHttp/> </behavior> </endpointBehaviors> <serviceBehaviors> <behavior name="default"> <serviceMetadata httpGetEnabled="true"/> <serviceThrottling maxConcurrentCalls="256" maxConcurrentSessions="1024" maxConcurrentInstances="1024"/> <serviceDebug includeExceptionDetailInFaults="true"/> </behavior> </serviceBehaviors> </behaviors> <bindings> <webHttpBinding> <binding name="general" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="00:01:00" maxReceivedMessageSize="4194304" maxBufferSize="4194304" maxBufferPoolSize="33554432"> <readerQuotas maxDepth="32" maxArrayLength="16384" maxStringContentLength="16384" maxBytesPerRead="8192" maxNameTableCharCount="65536"/> <security mode="None"> <transport clientCredentialType="None"/> </security> </binding> </webHttpBinding> </bindings> </system.serviceModel>
此時配置相關的算是已經配置好了。而後咱們就須要啓動服務和寫接口了。咱們在主窗口放一個button而後搞個點擊事件。
事件裏就寫上啓動服務的代碼。
private void Button_Click(object sender, RoutedEventArgs e) { ServiceHost host = new ServiceHost(typeof(Service1)); host.Open(); }
記得關閉的時候釋放下。
下面是接口相關。咱們開始添加wcf服務的時候引入了兩個主要的dll。
下面是個人接口名稱定製部分。
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace WpfTestWCF { // 注意: 使用「重構」菜單上的「重命名」命令,能夠同時更改代碼和配置文件中的接口名「IService1」。 [ServiceContract] public interface IService1 { [OperationContract, WebGet(UriTemplate = "test?name={filename}", ResponseFormat = WebMessageFormat.Json)] string DoWork(string filename); } }
實現就是return filename,就是測試數據。
點擊按鈕啓動服務。而後經過瀏覽器調用在app.config裏定義好的服務地址,就能夠調用到咱們接口裏的方法了,而後就能夠像調用web服務同樣了。
項目代碼我就不上傳了。已經講的很詳細了。我已經把代碼整合到個人Surface Go項目裏了,下面是GitHub的地址。