如何?通过 Https 的 WCF 自定义绑定

问题描述 投票:0回答:1

我正在尝试在我们面向外部的网络场上设置一个供内部使用的 WCF 服务(我们内部没有网络场,我需要此服务进行故障转移和负载平衡)。

要求:

  • PerSession 状态,因为我们需要服务为每个会话保留可变数据。
  • HTTPS。 经过大量谷歌搜索后,我读到了我需要创建一个自定义绑定,我已经完成了,但不确定它是否正确。
  • 更大的消息大小,因为参数之一是 byte[] 数组,最大可达 5mb。
  • 无需手动编辑客户端 app.config。 即,我需要开发人员仅添加服务引用,然后开始使用该对象,而无需繁琐地更改 app.config。

注意:我之前已经让此服务在 HTTP 下正确工作(使用 wsHttpBinding)。 我也让它在 HTTPS 下工作,但它不支持 PerSession 状态,并且每次函数调用都会丢失内部变量值。

我目前从测试工具中收到此错误:

在 ServiceModel 客户端配置部分中找不到引用合约“AppMonitor.IAppMonitorWcfService”的默认端点元素。这可能是因为没有找到适用于您的应用程序的配置文件,或者因为在客户端元素中找不到与此合同匹配的端点元素。

注意:该错误是在 Test Harness EXE 上出现的,该 EXE 直接在服务引用下引用了 WCF 服务。 这不是 exe 引用另一个对象,然后引用 WCF 服务的问题,我已经读过。

浏览 URL 时,WSDL 正确显示。

网络配置:

  <system.serviceModel>
    <services>
      <service name="AppMonitor.AppMonitorWcfService" behaviorConfiguration="ServiceBehavior">
        <endpoint address="" binding="customBinding" bindingConfiguration="EnablePerSessionUnderHttps" contract="AppMonitor.IAppMonitorWcfService"/>
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <customBinding>
        <binding name="EnablePerSessionUnderHttps" maxReceivedMessageSize="5242880">
          <reliableSession ordered="true"/>
          <textMessageEncoding>
            <readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          </textMessageEncoding>
          <httpsTransport authenticationScheme="Anonymous" requireClientCertificate="false"/>
        </binding>
      </customBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

EXE的App.config(添加服务引用时自动生成):

<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="CustomBinding_IAppMonitorWcfService" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="true" />
                    <security mode="Transport">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true"
                            establishSecurityContext="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client />
    </system.serviceModel>
</configuration>

我不确定为什么 app.config 显示 wsHttpBinding? 这不应该是自定义绑定吗? 我真的不想编辑 app.config,因为该服务将由数十个开发人员使用,我希望他们能够添加服务引用,然后就可以了。

使用VS2008、.NET 3.51。 我认为服务器是IIS7,Win Server 2008,如果需要可以确认。

wcf binding https
1个回答
0
投票

好的,您的问题是您尚未为您的服务定义地址。记住端点的 ABC:地址-绑定-契约。

您需要为服务定义一个地址,该地址几乎由 .svc 文件控制,并且可以从 IIS 浏览该文件。无论该 .svc 文件的 URL 是什么,您都可以附加您定义的地址(在您的情况下为空字符串),然后将其添加到顶部。因此,如果我将 myservice.svc 文件放在根目录中,它就会变成

https://localhost/myservice.svc/<ServiceAddress>

在你的情况下

ServiceAddress=""
所以URL是
https://localhost/myservice.svc/

请参阅此处了解更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.