【问题标题】:Config for WCF with multiple endpoints为具有多个端点的 WCF 配置
【发布时间】:2010-04-26 00:12:11
【问题描述】:

我是 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
{
    ...
}

但我可以创建 1 个类来明确实现所有 3 个接口,然后我将只有 1 个 svc,然后地址变得相关......对吗?

【问题讨论】:

  • 是的,如果你有三个类来实现服务契约,你需要三个SVC文件。如果您只有一个类实现所有三个接口,那么您需要一个 SVC 文件 - 每个类一个 SVC 文件来实现您的合同
  • 我已经创建了一个实现所有三个接口的类,但出现以下错误:“服务‘WcfService1.Service.DirectorySearchService’的应用程序(非基础设施)端点为零。这可能是因为没有配置为您的应用程序找到了文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在服务元素中没有定义端点。”有任何想法吗?我的配置如上,svc 看起来像

标签: c# .net wcf rest soap


【解决方案1】:

这取决于:-)

如果您想在 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 用于元数据交换(您不会直接使用)。

【讨论】:

  • 感谢您的反馈...我的一个大问题是,对于我拥有的接口和我想要的配置,我需要什么 svc 以及它们的名称是什么?我只需要指向默认服务的 1 个 svc 吗?
  • @vdh_ant:您需要每个服务类一个 SVC 文件。如果您有一个实现所有三个服务契约的服务类,那么您需要一个 SVC 文件 - 当您有三个单独的类,每个类都实现一个服务契约时,那么您需要 三个 SVC文件 - 每个服务类一个。您如何命名它完全取决于您 - 无论您喜欢什么 - 但请注意 - 名称和 .svc 扩展名将成为您服务 URL 的一部分!不要对这些名字太疯狂....
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    只是为了加入这个讨论。

    我遇到了同样的问题,最终我使用了部分类。

    每个端点都可以像您所做的那样由不同的接口实现,但是您的 svc 文件引用单个类名,然后您将类拆分为部分类,这是聪明的一点,每个部分类可以实现不同的接口.

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

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 2011-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-29
      • 1970-01-01
      相关资源
      最近更新 更多