WCF無.SVC文件服務激活,及不添加服務引用調用WCF

一,新建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的調用。

相關文章
相關標籤/搜索