28

所以我对服务端点和主机基地址的用途有点困惑。到目前为止,在我所经历的所有示例中,他们都在讨论使用所需绑定设置端点,您通常可以导航到这些端点

但是,当我使用以下配置来设置和托管我的服务时,它似乎只公开了主机基地址。

    <configuration>
      <system.web>
        <compilation debug="true" />
      </system.web>
      <!-- When deploying the service library project, the content of the config file must be added to the host's
      app.config file. System.Configuration does not support config files for libraries. -->
      <system.serviceModel>
        <services>
          <service name="HostService.EvalService">
            <endpoint address="http://localhost:8080/basic"
              binding="basicHttpBinding" contract="HostService.IEvalService" />
            <endpoint address="http://localhost:8080/ws"
              binding="wsHttpBinding" contract="HostService.IEvalService" />
            <endpoint address="mex" binding="mexHttpBinding"
              name="mex" contract="IMetadataExchange" />
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8080/EvalsService" />
              </baseAddresses>
            </host>
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
    </configuration>

谁可以给我解释一下这个?

4

3 回答 3

37

在 IIS 上托管 WCF 服务时,基地址只能是 .svc 文件的 URL。如果您指定任何其他基地址,它将被忽略。您仍然可以为端点指定相对 URI,例如address="basic"address = "ws"。然后端点上的地址变成<URL to the .svc file>/basic<URL to the .svc file>/ws在这种情况下。

于 2011-08-04T11:43:48.043 回答
22

当您将端点地址留空时,这意味着端点将简单地使用相应的基地址作为其端点地址。或者,您可以将基地址配置为服务的绝对路径,或者作为更好的方法,为端点编写相对地址。

在 IIS 上托管服务时,服务基地址由 IIS 虚拟目录以及 .svc 文件确定。

假设您有一个名为 calc.svc 的文件,并将其放置在对应于“http://localhost:8080/calcservice”的虚拟目录中。此服务的基址将是“http://localhost:8080/calcservice/calc.svc”。

IIS 强制您的端点使用根据您的服务部署路径确定的基地址。如果您指定的基地址与相应的虚拟目录不同,则会出现异常。

考虑下面的配置;

<configuration>
    <system.serviceModel>
        <services>
            <service name="CalculatorService">
              <!-- base address determined by IIS virtual directory -->
              <endpoint binding="basicHttpBinding" contract="ISimpleMath"/>
              <endpoint address="secure" binding="wsHttpBinding" contract="ISimpleMath"/>
              <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        ...

...因为我将端点地址留空,所以第一个端点的地址与基地址('http://localhost:8080/calcservice/calc.svc')相同。第二个端点的地址变成了基地址加上“secure”的组合,像这样:'http://localhost:8080/calcservice/calc.svc/secure'。“mex”端点的地址是“http://localhost:8080/calcservice/calc.svc/mex”。这对某些人来说可能有点奇怪,因为地址的相对部分被添加到文件名的右侧,但是您必须记住 calc.svc 是基地址的一部分,因此它必须以这种方式工作。

虽然您无法通过浏览器导航到“../mex”或“../secure” URL,但它们实际上是活动的,客户端可以使用这些地址。

客户行为

客户不知道服务的基地址,也不需要在他们的网络上支持类似的东西。因此,您不会在客户端对象模型或配置部分中找到与基地址相关的任何内容。客户端只需选择一个特定的端点,该端点总是配置有一个绝对地址,而该绝对地址决定了它将在传输过程中使用的地址。

以上信息大部分摘自 Aaron Skonnard在 msdn 上的优秀文章。我强烈建议您阅读它以了解 WCF 寻址背后的基础知识。

于 2013-01-09T12:21:50.243 回答
6

当您使用基地址时,您不需要为您的端点提供绝对 URI,例如,您可以address="basic"在端点配置部分使用,这意味着该端点的地址是http://localhost:8080/EvalsService/basic.

于 2011-08-04T11:28:00.300 回答