WCF:relativeAddress,baseAddress和binding

NET*_*NET 3 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>
Run Code Online (Sandbox Code Playgroud)

现在我可以访问服务了

http://localhost:18148/RelativeAddress.svc
Run Code Online (Sandbox Code Playgroud)

然后我添加下一行:

    <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>
Run Code Online (Sandbox Code Playgroud)

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

  http://localhost:18148/RelativeAddressX.svc
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*lex 7

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

有两种方法可以在WCF中为服务指定端点地址.您可以为与服务关联的每个端点指定绝对地址,也可以为服务的ServiceHost提供基址,然后为与此服务关联的每个端点指定相对于此基址定义的地址.您可以使用这些过程中的每一个在配置或代码中指定服务的端点地址.如果未指定相对地址,则服务使用基址.

*所以根据你的例子你有基地址

 http://localhost:18148/
Run Code Online (Sandbox Code Playgroud)

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

 http://localhost:18148/RelativeAddress.svc/RelativeAddressX.svc. 
Run Code Online (Sandbox Code Playgroud)

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

 <endpoint  address="RelativeAddressX" binding="basicHttpBinding" contract="WCF_Transactions.IService1"></endpoint>
Run Code Online (Sandbox Code Playgroud)

它应该可以通过路径访问

 http://localhost:18148/RelativeAddress.svc/RelativeAddressX
Run Code Online (Sandbox Code Playgroud)