2

我创建了一个 WCF Web 服务并将其托管在 IIS 上。web.config 看起来像这样:

[...]
<system.serviceModel>
    <behaviors>
        <serviceBehaviors>
            <behavior name="[Namespace].[ServiceNameBehavior]">
                <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>

    <services>
        <service name="[Namespace].[ServiceName]" behaviorConfiguration="[NameSpace].[ServiceNameBehavior]" >
            <endpoint address="basic" binding="basicHttpBinding" contract="[Namespace].[IService]" />
            <endpoint address="secure" binding="basicHttpsBinding" contract="[Namespace].[IService]" />
        </service>
    </services>
</system.serviceModel>
[...]

当我访问时,http://localhost/[Namespace]/[ServiceName].svc我会看到通常的 Web 服务网页,表明您已经创建了一个服务,并且要测试它,您应该使用 svcutil.exe 等调用该服务......

现在..问题是,正如在 web.config 中定义的那样,我想为此 Web 服务使用两种类型的连接(实际上只是限制对这两种连接的访问​​,因此禁用默认.svc调用)但是当我去 http://localhost/[Namespace]/[ServiceName].svc/basic或者https://localhost/[Namespace]/[ServiceName].svc/secure我得到一个空白页面,也无法从本地托管的 PHP 页面访问服务。

这些绑定的行为这样正常吗?如果没有,我该如何解决?


更新 1


我还注意到,尝试从 Visual Studio 创建对这些端点中的任何一个的引用会导致以下错误:

下载“https://localhost/[Namespace]/[ServiceName].svc/secure”时出错。请求失败,HTTP 状态为 400:错误请求。元数据包含无法解析的引用:“https://localhost/[Namespace]/[ServiceName].svc/secure”。内容类型应用程序/soap+xml;服务 https://localhost/[Namespace]/[ServiceName].svc/secure 不支持 charset=utf-8。客户端和服务绑定可能不匹配。远程服务器返回错误:(415)无法处理消息,因为内容类型'application/soap+xml; charset=utf-8' 不是预期的类型 'text/xml; charset=utf-8'.. 如果在当前解决方案中定义了服务,请尝试构建解决方案并再次添加服务引用。

添加对 http://localhost/[Namespace]/[ServiceName].svc 的引用效果很好。

4

1 回答 1

1

这一切看起来对我有用,你似乎混淆了服务 URL 和端点 URL 的概念:

  • <service>每个协议的每个元素只有一个服务 URL 。这用于获取测试页面、添加服务引用以及获取 WSDL 文档(通过?wsdl查询参数)。
  • <endpoint>每个元素还有一个端点 URL 。这些是以/basicor结尾的/secure。这些URL唯一能做的就是接受 SOAP 请求。您无法从它们那里获取元数据或浏览它们。对此有一个例外,您可以/mex使用mexHttpBindingmexHttpsBinding通过 SOAP 请求返回元数据来公开端点。这完全是可选的,在您的情况下是不必要的,因为您改为通过 HTTP(S) GET 公开 WSDL。

在客户端,在 Visual Studio 中,您使用http://localhost/[Namespace]/[Service].svc. 如果手动定义客户端端点,则将它们的地址分别设置为http://localhost/[Namespace]/[Service].svc/basichttp://localhost/[Namespace]/[Service].svc/secure

更新:

要防止http://localhost/[Namespace]/[Service].svcURL 响应请求,请在服务配置中禁用元数据发布:

<behaviors>
    <serviceBehaviors>
        <behavior name="[Namespace].[ServiceNameBehavior]">
            <serviceMetadata httpGetEnabled="false" httpsGetEnabled="false"/>
            <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
    </serviceBehaviors>
</behaviors>

显然,如果您这样做,那么您将无法再在任何客户端代码中添加新的服务引用,但这在您同时控制客户端和服务器代码的生产环境中是完全可以接受的。

于 2012-10-09T18:00:40.037 回答