2010-04-26 114 views
2

我是WCF的新手,並試圖讓我有一些想法。配置多個端點的WCF

基本上我有在其web.config中的以下網頁WCF應用程序項目:

<system.serviceModel> 
    <services> 
     <service name="WcfService1.ServiceContract.IDirectorySearchService" behaviorConfiguration="defaultServiceBehavior"> 
      <endpoint name="restxml" address="xml" binding="webHttpBinding" contract="WcfService1.ServiceContract.IDirectorySearchServiceXml" behaviorConfiguration="xmlRestBehavior"/> 
      <endpoint name="restjson" address="json" binding="webHttpBinding" contract="WcfService1.ServiceContract.IDirectorySearchServiceJson" behaviorConfiguration="jsonRestBehavior"/> 
      <endpoint name="soap" address="soap" binding="basicHttpBinding" contract="WcfService1.ServiceContract.IDirectorySearchService"/> 
      <endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="defaultServiceBehavior"> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
      <behavior name="xmlRestBehavior"> 
       <webHttp/> 
      </behavior> 
      <behavior name="jsonRestBehavior"> 
       <enableWebScript/> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 

我的界面是這樣的:

[ServiceContract] 
public interface IDirectorySearchServiceXml 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "Search/")] 
    SearchResults Search(); 
} 

[ServiceContract] 
public interface IDirectorySearchServiceJson 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "Search/")] 
    SearchResults Search(); 
} 

[ServiceContract] 
public interface IDirectorySearchService 
{ 
    [OperationContract] 
    SearchResults Search(int? sportId, int? instituteId, DateTime? startDate, DateTime? endDate); 
} 

現在我有一個小麻煩的部分與什麼我需要得到這個啓動和運行...就像給了這個.svc文件我需要什麼,我有配置權...還有我需要使用什麼地址來通過瀏覽器或通過WCF測試客戶端。注意我目前使用3.5。

乾杯 安東尼

UPDATE:

所以如果我有類似下面,我將需要3個不同的SVC文件...如果是這樣的話那麼就沒有什麼意義有在終點地址部分......

public class DirectorySearchServiceXml : IDirectorySearchServiceXml 
{ 
    ... 
} 

public class DirectorySearchServiceJson : IDirectorySearchServiceJson 
{ 
    ... 
} 

public class DirectorySearchService : IDirectorySearchService 
{ 
    ... 
} 

但我可以創建1類exsplictly implments所有3個接口,那我就只有1個SVC,然後在地址變成培訓相關...是正確的?

+0

是的,如果你有**三個類**實現服務契約,你需要**三個SVC文件**。如果你只有**一類**實現所有三個接口,那麼你需要**一個SVC文件** - 每個類實現您的合同一個SVC文件 – 2010-04-26 08:13:16

+0

我已經做了一個類實現所有三個接口,我得到出現以下錯誤:「服務'WcfService1.Service.DirectorySearchService'沒有應用程序(非基礎設施)端點,這可能是因爲沒有爲您的應用程序找到配置文件,或者因爲在配置中找不到匹配服務名稱的服務元素文件,或者因爲在服務元素中沒有定義端點。「有任何想法嗎?我的配置和上面一樣,svc看起來像<%@ ServiceHost Language =「C#」Debug =「true」Service =「WcfService1.Service.DirectorySearchService」%> – 2010-04-26 08:55:45

+0

我使用的URL是「http:// localhost:16089/DirectorySearchService.svc/mex「 – 2010-04-26 08:57:02

回答

2

這取決於:-)

如果你想在IIS來承載您的WCF服務(檢查MSDN How To: Host a WCF Service in IIS),因爲我從你的問題假設,那麼你需要三樣東西:

  • 虛擬目錄(也可能是它們的一個子目錄),在這裏您可以把你的服務文件(yourservice.svc)爲
  • 服務文件 - 簡短的一行
  • 在你的web.config適當配置部分

服務文件(* .svc)只是一個很小的單行文本文件,用於指示IIS如何創建服務。它看起來像這樣:

<%@ServiceHost language=c# Debug="true" 
       Service="Microsoft.ServiceModel.Samples.CalculatorService"%> 

language屬性定義WCF服務的語言,debug啓用調試(用於開發和測試,禁用它用於生產),以及Service=定義哪些類(命名空間完全合格,並所有)實際上實現您的服務。接下來,您需要將這些服務實現放入* .svc(不推薦)的代碼隱藏文件中,或者 - 更好 - 將WCF服務實現編譯到類庫中,並將該類庫粘貼到您的虛擬目錄下的.\bin目錄。

最後,您需要在您的服務器端web.config中進行適當的配置 - 從我所知道的情況來看,您已經擁有了相應的配置,並且我認爲它應該沒問題。

您的服務地址將被

  • 服務器
  • 虛擬目錄(以及可能的子目錄)確定
  • 服務文件本身

,你可能有任何額外的設置您的個人服務終端的配置。

所以你的情況,你必須

  • http://yourserver:port/YourVirtualDirectory/YourService.svc/restxml
  • http://yourserver:port/YourVirtualDirectory/YourService.svc/restjson
  • http://yourserver:port/YourVirtualDirectory/YourService.svc/soap

爲你的真實功能,併爲元數據交換* http://yourserver:port/YourVirtualDirectory/YourService.svc/mex(你不會直接使用)。

+0

感謝您的反饋......我有一個很大的問題,對於我有的接口和我想要的配置,我需要什麼樣的svc,他們的名字是什麼?我只需要1個指向默認服務的svc? – 2010-04-26 07:38:40

+0

@vdh_ant:您需要**每個服務類**有一個SVC文件。如果你有一個實現所有三個服務契約的服務類,那麼你需要**一個SVC文件** - 當你有三個獨立的類,每個實現一個服務契約時,你需要**三個SVC文件** - 每個服務級別一個。你的名字完全取決於你 - 無論你喜歡什麼 - 但請注意 - 名稱和.svc擴展名成爲你的服務URL的一部分!不要對這些名字太瘋狂.... – 2010-04-26 07:43:13

+0

感謝您的更新...請參閱上面的更新。 – 2010-04-26 07:55:17

1

我在一個服務中也遇到了多個端點的問題。我總是得到錯誤400.我的錯誤是不使用web.config中的不同地址。因此,對每個端點使用不同的地址=配置(示例在第1篇文章中)非常重要。一個端點可以忽略它或將其留空。所有其他人都需要它。

0

只是添加到這個討論。

我遇到了同樣的問題,最後我使用了部分類。

每個端點都可以像你所做的那樣通過不同的接口來實現,但是你的svc文件引用了一個單獨的類名,然後將你的類拆分爲部分類,這裏是聰明的一點,每個部分類可以實現一個不同的類接口。

然後,你可以保持你的實現和接口分開,但仍然需要svc文件引用一個類。