簡體   English   中英

WCF端點自定義以簡化配置

[英]Wcf endpoint customization for simplified configuration

我使用簡化的配置(通過config文件中沒有顯式的<service>節點)通過IIS公開的同一類來實現大量的服務合同。

這可以很好地工作,並且為我們節省了很多麻煩,因為我們在客戶端上有一些邏輯可以自動構建指向相同URL的端點。

現在,我想在客戶端和服務器上自定義合同之一,因為它的行為與其余合同完全不同。 我想為此特殊合同類使用流傳輸,因為它既返回又獲取get的Stream實例。

當我嘗試在服務器上添加一個<service>節點,指向共享的實現類並使用此特殊的協定接口時,其他服務的整個自動配置都丟失了,剩下的只有一個服務。 我認為這與以下事實有關:我使用的是單個實現類,並且Wcf一旦檢測到配置中存在具有該類名稱的服務,就會停止為其他合約自動生成端點。

有沒有辦法使這項工作仍然共享相同的類並維護簡化的配置?

您可以通過創建自己的服務工廠並覆蓋激活過程的各個部分來實現。

假設您有兩個這樣的服務合同。

public interface IService1
{
    [OperationContract]
    string GetData(int value);
}

[ServiceContract]
public interface IService2
{
    [OperationContract]
    string Foobar();
}

假設這些是在這樣的單個類中實現的。

public class Service1 : IService1, IService2
{
    public string GetData(int value)
    {
        return string.Format("You entered: {0}", value);
    }
    public string Foobar()
    {
        return "foobar";
    }
}

現在,如果只想更改第二個服務協定的端點,則在.svc文件中,添加Factory屬性以指向自定義服務工廠實現。

<%@ ServiceHost Language="C#" Debug="true" Factory="SimpleWCF2.MyServiceFactory" Service="SimpleWCF2.Service1" CodeBehind="Service1.svc.cs" %>

接下來,創建一個實例化定制服務主機的定制服務工廠。 在定制服務主機中,重寫ApplyConfiguration並刪除協定2的默認終結點,並將其替換為定制終結點配置。 例如,這里我僅將合同2的默認“ basicHttpBinding”替換為“ WsHttpBinding”。您當然可以配置綁定,但是需要(您提到了流傳輸)-這只是一個示例。

public class MyServiceFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        return new MyServiceHost(serviceType, baseAddresses);
    }
}

public class MyServiceHost : ServiceHost
{
    public MyServiceHost(Type serviceType, params Uri[] baseAddresses) :
        base (serviceType, baseAddresses)
    { }

    protected override void ApplyConfiguration()
    {
        base.ApplyConfiguration();

        AddDefaultEndpoints();

        // Remove the default endpoint for IService2
        var defaultEp = this.Description.Endpoints.FirstOrDefault(e => e.Contract.ContractType == typeof(IService2));
        this.Description.Endpoints.Remove(defaultEp);

        // Add a new custom endpoint for IService2
        this.AddServiceEndpoint(typeof(IService2), new WSHttpBinding(), "test");
    }
}

而已。 無需更改您的簡化配置。

現在,您的客戶將通過新服務端點發現第二份合同。 例如,這是我示例中的WCF測試客戶端。

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM