[英]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.