WCF:relativeAddress,baseAddress和binding

时间:2013-02-13 08:19:38

标签: wcf web-config wcf-binding

我是WCF的新手,并开始使用一个简单的无文件应用程序部分(web.config),您可以在下面看到:

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
        <serviceActivations>
            <add
                factory="System.ServiceModel.Activation.ServiceHostFactory"
                relativeAddress="./RelativeAddress.svc"
                service="WCF_Transactions.MyService1"/>
        </serviceActivations>
    </serviceHostingEnvironment>

现在我可以通过

访问服务了
http://localhost:18148/RelativeAddress.svc

然后我添加下一行:

    <services>
        <service name="WCF_Transactions.MyService1" behaviorConfiguration="MyBehavior1">
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost:18148/" />
                </baseAddresses>
            </host>
            <endpoint  address="/RelativeAddressX.svc" binding="basicHttpBinding" contract="WCF_Transactions.IService1"></endpoint>
        </service>
    </services>

    <behaviors>
        <serviceBehaviors>
            <behavior name="MyBehavior1">
                <serviceMetadata httpGetEnabled="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>

所以我希望我的服务可以通过下一个地址访问:

  http://localhost:18148/RelativeAddressX.svc

但我不能这样做。我误解了什么?

2 个答案:

答案 0 :(得分:7)

MSDN http://msdn.microsoft.com/en-us/library/ms733749.aspx: *

  

有两种方法可以在WCF中为服务指定端点地址。   您可以为与之关联的每个端点指定绝对地址   服务或您可以提供服务主机的基地址   service,然后为与之关联的每个端点指定一个地址   此服务是相对于此基址定义的。您可以   使用这些过程中的每一个来指定a的端点地址   在配置或代码中提供服务。如果你没有指定   相对地址,服务使用基地址。

* 因此,根据您的示例,您有基本地址

 http://localhost:18148/

它将与RelativeAddress.svc结合使用,作为svc文件的名称。然后它会尝试将此字符串与/RelativeAddressX.svc组合作为端点地址的一部分。所以你会有像

这样的东西
 http://localhost:18148/RelativeAddress.svc/RelativeAddressX.svc. 

您的端点不得在IIS中指定svc的路径。它应该只包含一个逻辑地址,与此点相关。 因此,请尝试将您的终端更改为以下内容:

 <endpoint  address="RelativeAddressX" binding="basicHttpBinding" contract="WCF_Transactions.IService1"></endpoint>

它应该可以通过路径访问

 http://localhost:18148/RelativeAddress.svc/RelativeAddressX

答案 1 :(得分:2)

在IIS或Cassini中托管时,无需在配置文件中指定 - 基本URL由Web服务器提供。该元素在自托管时使用。 Cassini(在Web服务器中构建VS)将忽略它。

这是一个关于WCF寻址的好页面: http://msdn.microsoft.com/en-us/magazine/cc163412.aspx

以下是一些相关帖子: WCF Service Endpoints vs Host Base address WCF, changing the baseAdress of an endpoint