2012-09-29 62 views
0

由於某些要求,我必須爲多個服務版本使用單個svc。我使用不同的命名空間爲每個版本分離了接口合約。我只有一個類(部分)實現所有服務版本。使用單個SVC進行WCF服務版本控制

我的代碼是如下:

namespace Application.V1 
{ 
[ServiceContract(Namespace = "http://google.com/ApplicationService/v1.0", Name = "IMathService")] 
public interface IMathService 
} 

namespace Application.V2 
{ 
[ServiceContract(Namespace = "http://google.com/ApplicationService/v2.0", Name = "IMathService")] 
public interface IMathService 
} 

中的應用/ MathServiceV1.cs文件:

public partial class MathService : V1.IMathService { } 

中的應用/ MathServiceV2.cs文件:

public partial class MathService : V2.IMathService { } 

中的應用/ MathService.cs文件:

public partial class MathService {} 

我已經添加在web.config中的服務如下:

<service behaviorConfiguration="ServiceBehavior" name="Application.MathService"> 
    <endpoint address="V1" binding="wsHttpBinding" contract="Application.V1.IMathService" /> 
    <endpoint address="V2" binding="wsHttpBinding" contract="Application.V2.IMathService" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
    </service> 

我有一個文件MathService.svc有以下幾點:

<%@ ServiceHost Service="Application.MathService, Application" 
Factory="Autofac.Integration.Wcf.AutofacServiceHostFactory, Autofac.Integration.Wcf"%> 

如果我生成的地址http://localhost:8000/MathService.svc代理客戶端點生成如下:

<client> 
     <endpoint address="http://localhost:8000/MathService.svc/V1" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMathService" 
      contract="MathService.IMathService" name="WSHttpBinding_IMathService"> 
     </endpoint> 
     <endpoint address="http://localhost:8000/MathService.svc/V2" 
      binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IMathService1" 
      contract="MathService.IMathService1" name="WSHttpBinding_IMathService1"> 
     </endpoint> 
    </client> 

我的濃度ern是用MathService.svc/V1生成的客戶端端點地址,但我想看到V1/MathService.svc

如果我瀏覽地址爲http://localhost:8000/MathService.svc/V1的服務,我得到的是HTTP 400 Bad Request錯誤。

有什麼建議嗎?

+0

請解釋您的意思,以便任何客戶端都可以瀏覽服務? – Jeroen

+0

我的意思是說,如果地址格式在http:// localhost:8000/V1/MathService.svc而不是http:// localhost:8000/MathService.svc/V1中,enduser可以瀏覽該服務。 –

回答

1

關於您的400錯誤請求錯誤 - 您可能沒有啓用MEX,因此在沒有有效負載的情況下發出請求對服務沒有意義。

這是一個關於啓用MEX問題: WCF How to enable metadata? 可以啓用MEX - 或使用適當的服務消費者打電話到您的服務。

關於您的尋址 - 您無法單獨使用WCF。因爲您使用的是IIS託管的WCF(我假設這是因爲您使用的是SVC文件),所以您的HTTP請求必須定向到SVC文件的位置,並且之後的任何內容(例如/ V1)用於定位適當的端點。這只是它在IIS中的工作原理。將/ v1 /之前的文件名(MathService.asmx)告訴IIS在嘗試查找名爲MathService.asmx的文件之前查找名爲/ v1 /的文件夾 - 顯然它不會在其中找到任何內容!

但是,您可能能夠在Web.config中安裝URL重寫器,以將您的首選URI重定向到上面提到的URI。 以下是關於在asp.net中進行Url重寫的一些文檔: http://www.iis.net/learn/extensions/url-rewrite-module/iis-url-rewriting-and-aspnet-routing