使用多个端点配置WCF

时间:2010-04-26 00:12:12

标签: c# .net wcf rest soap

我是WCF的新手,我正试图获得一些我的想法。

基本上我有一个Web WCF应用程序项目,其web.config中包含以下内容:

<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。

干杯 安东尼

更新:

所以如果我有类似下面这样的东西,我需要3个不同的svc文件...如果是这样的话,那么在终点中有地址部分没什么意义......

public class DirectorySearchServiceXml : IDirectorySearchServiceXml  
{
    ...
}

public class DirectorySearchServiceJson : IDirectorySearchServiceJson  
{ 
    ...
}

public class DirectorySearchService : IDirectorySearchService
{
    ...
}

但是我可以创建一个可以实现3个接口的exsplictly的类,然后我只有1个svc然后地址变得相关......这是正确的吗?

3 个答案:

答案 0 :(得分: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=定义哪个类(完全限定) with namespace和all)实际上实现了你的服务。

接下来,您需要将这些服务实现放入* .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表示元数据交换(不会直接使用)。

答案 1 :(得分:1)

我在一个服务中的多个端点也遇到了一些问题。我总是得到错误400.我的错误是不在web.config中使用不同的地址。因此,对于每个端点使用不同的地址=配置非常重要(例如,在第1篇文章中)。一个端点可以省略它或将其留空。所有其他人都需要它。

答案 2 :(得分:0)

只是为了加入讨论。

我遇到了同样的问题,最后我开始使用部分课程。

每个端点都可以通过不同的接口实现,但是你的svc文件引用单个类名,然后将类拆分为部分类,这里是聪明的位,每个部分类可以实现不同的接口

然后,您可以将实现和接口分开,但仍然需要svc文件来引用一个类。