一,新建WCF服務引用程序app
1,刪除.svc文件,所有刪除。函數
2,新建 IService 類測試
namespace TestWcf { [ServiceContract] public interface IService { [OperationContract] string DoWork(); } }
3,實現接口類 Service類spa
namespace TestWcf { public class Service : IService { public string DoWork() { return "你妹!"; } } }
4,編寫配置文件代理
<system.serviceModel> <!--添加此節點,不然出現405錯誤--> <bindings> <wsHttpBinding> <binding name="NoneSecurity" maxBufferPoolSize="12000000" maxReceivedMessageSize="12000000" useDefaultWebProxy="false"> <readerQuotas maxStringContentLength="12000000" maxArrayLength="12000000"/> <security mode="None"/> </binding> </wsHttpBinding> </bindings> <behaviors> <serviceBehaviors> <behavior name="metadataBehavior"> <!-- 爲避免泄漏元數據信息,請在部署前將如下值設置爲 false --> <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> <!-- 要接收故障異常詳細信息以進行調試,請將如下值設置爲 true。在部署前設置爲 false 以免泄漏異常信息 --> <serviceDebug includeExceptionDetailInFaults="false"/> </behavior> </serviceBehaviors> </behaviors> <protocolMapping> <add binding="wsHttpBinding" scheme="http" /> </protocolMapping> <services> <service name="TestWcf.Service" behaviorConfiguration="metadataBehavior"> <endpoint address="" binding="wsHttpBinding" contract="TestWcf.IService" bindingConfiguration="NoneSecurity"> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <!--無svc文件wcf服務激活--> <serviceHostingEnvironment> <serviceActivations> <add relativeAddress="Service.svc" service="TestWcf.Service"/> </serviceActivations> </serviceHostingEnvironment> </system.serviceModel>
5,注意事項調試
如下代碼是無.svc,激活WCF服務的關鍵,WCF4.0的新特性code
從消息交換的角度來講,客戶端對IIS/WAS寄宿下服務的調用本質上體如今對.svc這個真實存在的物理文件的訪問。若是服務還沒有激活,WCF最終根據讀取請求的物理文件來激活相應的服務。具體來講,就是獲 取用於建立ServiceHost的ServiceHostFactory的類型(若是沒有經過<%@ServiceHost%>指令的 Factory進行顯式設置,默認使用的ServiceHostFactory的類型爲 System.ServiceModel.Activation.ServiceHostFactory)。在正確解析出 ServiceHostFactory類型以後,經過反射建立用於寄宿服務的ServiceHost對象。對象
若是WCF的服務端可以根據請求正確地建立出基於目標服務的ServiceHost,就能解決服務的激活問題。進一步來講,若是服務端可以維護一個 Service/ServiceHostFactory與請求地址之間的映射關係,咱們就能夠再也不須要.svc文件,由於.svc對於服務激活來講就是起 到了這麼一個映射的做用。在最新的WCF中,這麼一個映射關係能夠在配置文件中進行設置。換言之,若是在配置對這個映射關係進行了相應設置以後,咱們將不 再須要爲服務定義了.svc文件了。blog
在<system.serviceModel>/<serviceHostingEnvironment>配置節下,具備 一個<serviceActivations>子節點。上述的關於Service/ServiceHostFactory與請求地址之間的映 射關係就定義在這個配置節點下。具體來講,<serviceActivations>配置節下的配置元素具備三個基本的屬性,其中 service和factory對用着原來定義在.svc文件中<%@ServiceHost>指令的Service和Factory屬性, 而relativeAddress則表示服務相對服務寄宿的IIS站點的地址,該地址必須以.svc爲後綴。下面一段配置與上面給出的.svc文件具備相 同的做用,有了這段配置,.svc就再也不須要了。接口
<!--無svc文件wcf服務激活--> <serviceHostingEnvironment> <serviceActivations> <add relativeAddress="Service.svc" service="TestWcf.Service"/> </serviceActivations> </serviceHostingEnvironment>
二,不直接引用WCF服務,使用代理類實現對WCF的調用
1,新建控制檯程序,新建客戶端代理類,MyClient
namespace WCFClient { /// <summary> /// 用於調用服務的類 /// </summary> public class MyClient : ClientBase<IService>, IService { public MyClient(Binding binding, EndpointAddress edpAddress) : base(binding, edpAddress) { } /// <summary> /// 調用服務端函數 /// </summary> /// <returns></returns> public string DoWork() { return base.Channel.DoWork(); } } }
2,調用測試
namespace WCFClient { class Program { static EndpointAddress edpHttp = new EndpointAddress("http://10.11.109.7:8001/Service.svc"); static void Main(string[] args) { MyClient client = new MyClient(new WSHttpBinding(SecurityMode.None), edpHttp); Console.WriteLine(client.DoWork()); Console.ReadKey(); } } }
3,運行結果
這樣就能夠不須要添加服務引用,而直接純代碼手工實現對WCF的調用。